给定映射了以下属性的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服务中发布的属性?
如果没有,我应该在实施中做些什么改变才能做到这一点?
感谢。
答案 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