【问题标题】:Choosing which attributes to publish in RESTful web service选择要在 RESTful Web 服务中发布的属性
【发布时间】:2016-02-28 09:02:40
【问题描述】:

给定一个映射了以下属性的用户实体:

@Entity
@Table(name = "user")
public class User {

    //...

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private Long id;

    @Column(name = "user_email")
    private String email;

    @Column(name = "user_password")
    private String password;

    @Column(name = "user_type")
    @Enumerated(EnumType.STRING)
    private UserType type;

    @Column(name = "user_registered_date")
    private Timestamp registeredDate;

    @Column(name = "user_dob")
    @Temporal(TemporalType.DATE)
    private Date dateOfBirth;

    //...getters and setters
}

我创建了一个通过 ID 返回用户的控制器方法。

@RestController
public class UserController {

    //...

    @RequestMapping(
            value = "/api/users/{id}", 
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<User> getUser(@PathVariable("id") Long id) {

        User user = userService.findOne(id);

        if (user != null) {
            return new ResponseEntity<User>(user, HttpStatus.OK);
        }

        return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
    }

    //...
}

我的业务逻辑层中的一个服务。

public class UserServiceBean implements UserService {

    //...
    public User findOne(Long id) {
        User user = userRepository.findOne(id);
        return user;
    }

    //...
}

我的数据层中有一个存储库。

public interface UserRepository extends JpaRepository<User, Long> {

}

这很好用,它返回有关用户的所有信息,但我在应用程序的几个不同部分使用它,并且在某些情况下我只需要用户的特定字段。

我正在学习 spring-boot 来创建 web 服务,并且想知道:鉴于当前的实现,有没有办法选择我想在 web 服务中发布的属性?

如果不是,我应该在实现中进行哪些更改才能做到这一点?

谢谢。

【问题讨论】:

标签: java spring rest jpa spring-boot


【解决方案1】:

首先,我同意使用 DTO,但如果它只是一个虚拟 PoC,你可以在 User 属性中使用 @JsonIgnore(杰克逊注解)来避免序列化它们,例如:

@Entity
@Table(name = "user")
public class User {

    //...

    @Column(name = "user_password")
    @JsonIgnore
    private String password;

但是你可以看到,因为你没有使用 DTO,你会混合 JPA 和 Jackson 注释(太糟糕了!)

更多关于杰克逊的信息:https://github.com/FasterXML/jackson-annotations

【讨论】:

  • 感谢您的回答。这是一个 PoC,是的,但我想逐步改进它。我将创建一些 DTO 并让我的服务层公开它们,所以我的 JPA 实体不会比这更进一步。
  • 没关系,这确实是一个很好的做法。无论如何,如果您想指定如何序列化/反序列化您的 DTO,您可以使用 Jackson 注释对您的 DTO 进行注释。
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 2015-05-08
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多