选择要在RESTful Web服务中发布的属性

时间:2015-11-25 14:14:40

标签: java spring rest jpa spring-boot

给定映射了以下属性的User实体:

@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服务中发布的属性?

如果没有,我应该在实施中做些什么改变才能做到这一点?

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

    //...

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

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

有关jackson的更多信息:https://github.com/FasterXML/jackson-annotations