
刚触 SpringBoot 不久,想请教 V 友们一个问题:
@Entity public class Task { // Other fields... @CreatedBy @ManyToOne @JoinColumn(name = "created_by", referencedColumnName = "id") private Integer createdBy; } @Entity public class User { private Integer id; private String nickname; // Don't want to show only in Task private String email; // ... } 实体 Task 多对一关联了实体 User ,除了添加@JsonIgnore的方式,如何让 Task 作为 ResponseBody 序列化时忽略 User 中的某些字段?
不想使用@JsonIgnore注解的原因是还想在其他的接口中返回 User 的全部字段,还望 V 友们不吝赐教。
1 wenbinwu 2023 年 2 月 26 日 弄两个 User class? |
2 ginakira OP @wenbinwu 正常通过 Repository 查询部分字段可以用 Projection 解决,但这种在关联字段里的就不知道怎么弄了……如果用两个 User class 的话该如何映射到真正的 User 表呢 |
3 arjen 2023 年 2 月 26 日 SQL 写 JOIN ,然后弄个 DTO 对象 |
4 thinkershare 2023 年 2 月 26 日 本来就不应该将你的实体暴露给最终用户,肯定是给不同的接口按照不同使用需求添加 Dto 哈。 然后找个 Mapper 实现自动映射,如果有必要甚至可用上 GraphQL 或者其它 BFF 层。 在高级一点,将查询和命令分离,上 CQRS. |
5 lybcyd 2023 年 2 月 26 日 via Android 根据你的需要,额外定义 DTO ,只包含你想返回的字段,然后把查询出来的数据拼装进去,而不是直接返回实体类。 |
6 ginakira OP @thinkersharelybcyd 感谢 |
7 mmdsun 2023 年 2 月 26 日 "不想使用 @JsonIgnore 注解的原因是还想在其他的接口中返回 User 的全部字段" 这个需求你可以用 @JsonView ,把这个注解加到字段上 @JsonView(SimpleView.class) private String username; @JsonView(DetailView.class) private String password; SimpleView 、DetailView.class 其实就是一个空接口,可有有继承的关系。 比如 intreface DetailView extends SimpleView {} 然后再你控制器上加上你这个接口, 这样你可以精确控制 哪些接口显示哪些字段了 @GetMapping @JsonView(UserProfile.PublicView.class) |