6 回答
TA贡献1776条经验 获得超12个赞
最简单的方法是通过默认 JSON 库 Jackson 提供的注释来控制 JSON 的序列化。
https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonIgnore.html
@JsonIgnore
@Column(name = "password")
private String password;
您还可以通过 Jackson mixin 来执行此操作,以避免 JSON 处理指令“污染”实体。
TA贡献1765条经验 获得超5个赞
实际上,jpa查询中有一种方法只返回特定字段,这样您就可以在获取结果时直接使用。
但如果您不想干扰 findByUsername 方法,只需创建 User 类的对象并仅设置所需的字段即可。
您目前使用的方法也是可行的解决方案。
TA贡献1802条经验 获得超5个赞
如果您想从响应中排除密码,请使用 注释密码字段@JsonIgnore
。
如果您想排除实体中的多个字段User
,请创建一个UserDto
类并在该类中添加所需的字段UserDto
。
用于ModelMapper
将用户实体映射到UserDto
类。最后返回这个 UserDto 类作为响应对象。
例子:
User user = new User(); UserDto userDto = new ModelMapper.map(user, UserDto.class);
这将仅包括 UserDto 中的字段
TA贡献1946条经验 获得超4个赞
除了已经提到的回复之外,还有其他一些方法,例如 JsonIgnoreProperties、JsonIgnoreType、JsonFilter。我更喜欢 JsonIgnore 来抑制输出中的字段。
此外,您始终可以创建一个单独的 POJO 类来返回所需的值。
TA贡献1853条经验 获得超9个赞
因此,有两种不同的方法可以解决这个问题。
transient
在您的实体类中创建密码字段。
这样,当您获取 Users 对象时,密码字段将为空。
缺点:使密码成为临时密码将导致您无法通过应用程序中任何位置的实体获取密码。
在密码字段上使用
@JsonIgnore
(来自杰克逊库)。这样,当您返回 Users 对象的对象时,密码字段将被忽略。
缺点:这再次意味着,如果您想在整个应用程序中将密码字段作为输入或返回密码字段,您将无法这样做。另外,不建议您返回 POJO 类的对象作为响应。
因此,您可以选择任何一种方法,同时记住每种方法的缺点。
TA贡献1798条经验 获得超3个赞
这里典型的最佳实践是将密码视为子资源:逻辑上不是用户资源的直接部分,但与其相关(例如,它可能有自己的 URL /users/{id}/password
)。当您具有 JPA 关系时,Spring Data REST 会自动处理此问题@OneToOne
,但您自己处理也没有问题。
此示例说明了为什么直接使用类作为 JSON API 表示不是一个好主意@Entity
,因为您可能希望在内部存在差异(包括将来进行更改而不打扰客户端)。相反,请使用充当实体的“JSON 副本”的数据传输对象(DTO)。像MapStruct这样的工具使得在User
和之间复制属性变得非常简单UserDto
。
(最后,如果您确实发现自己由于某些奇怪的原因需要返回裸机Map
(这种情况确实发生了),那么为了简单起见,通常最好使用它Map.of("key", value)
。)
添加回答
举报