给定一个具有以下映射属性的 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 返回用户的 Controller 方法。
@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 服务中发布的属性?
如果没有,我应该在实现中更改什么才能做到这一点?
谢谢。
最佳答案
首先,我同意使用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
关于java - 选择要在 RESTful Web 服务中发布的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33918775/