为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Spring Boot 从类中仅返回几种类型?

如何使用 Spring Boot 从类中仅返回几种类型?

偶然的你 2023-07-13 16:56:33
我有一个包含用户信息(包括密码字段)的类。当用户登录时,它将返回类中的所有内容,包括密码。除了密码或仅保留在数据库中的任何重要数据之外,如何不返回课堂上的所有内容。我尝试使用地图,这也返回我想要的方式,但我希望是否有比地图更简单或更快的东西。很少有答案建议使用 JsonIgnore 和瞬态。如果我使用这两种方法,我将无法登录。因为我需要找回密码才能登录。我的 POJO 类@Entitypublic class Users {@Column(name = "id")@GeneratedValue(strategy = GenerationType.AUTO)private long id;@Column(name = "firstname")private String firstName;@Column(name = "lastname")private String lastName;@Id@Column(name = "username")private String username;@Column(name = "email")private String email;@Column(name = "role")private String role;@Column(name = "password")private String password;回购类  public interface UsersRepository extends CrudRepository<Users,   String> {public Users findByUsername(String username);}这是休息 API@GetMapping("/users/{username}")public Map<String, Object> usersCheck(@PathVariable String  username) {    Map<String, Object> addUser = new HashMap<>();    Users user = userRepo.findByUsername(username);    addUser.put("email", user.getEmail());    addUser.put("firstName",user.getFirstName()); " "    return addUser;}还有比 Map 更好的方法吗?任何建议都会有所帮助。
查看完整描述

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 处理指令“污染”实体。


查看完整回答
反对 回复 2023-07-13
?
POPMUISE

TA贡献1765条经验 获得超5个赞

实际上,jpa查询中有一种方法只返回特定字段,这样您就可以在获取结果时直接使用。

但如果您不想干扰 findByUsername 方法,只需创建 User 类的对象并仅设置所需的字段即可。

您目前使用的方法也是可行的解决方案。


查看完整回答
反对 回复 2023-07-13
?
慕后森

TA贡献1802条经验 获得超5个赞

如果您想从响应中排除密码,请使用 注释密码字段@JsonIgnore

如果您想排除实体中的多个字段User,请创建一个UserDto类并在该类中添加所需的字段UserDto

用于ModelMapper将用户实体映射到UserDto类。最后返回这个 UserDto 类作为响应对象。

例子:

  User user = new User();
    UserDto userDto = new ModelMapper.map(user, UserDto.class);

这将仅包括 UserDto 中的字段


查看完整回答
反对 回复 2023-07-13
?
绝地无双

TA贡献1946条经验 获得超4个赞

除了已经提到的回复之外,还有其他一些方法,例如 JsonIgnoreProperties、JsonIgnoreType、JsonFilter。我更喜欢 JsonIgnore 来抑制输出中的字段。

此外,您始终可以创建一个单独的 POJO 类来返回所需的值。


查看完整回答
反对 回复 2023-07-13
?
暮色呼如

TA贡献1853条经验 获得超9个赞

因此,有两种不同的方法可以解决这个问题。

  1. transient在您的实体类中创建密码字段。

这样,当您获取 Users 对象时,密码字段将为空。

缺点:使密码成为临时密码将导致您无法通过应用程序中任何位置的实体获取密码。

  1. 在密码字段上使用@JsonIgnore(来自杰克逊库)。这样,当您返回 Users 对象的对象时,密码字段将被忽略。

缺点:这再次意味着,如果您想在整个应用程序中将密码字段作为输入或返回密码字段,您将无法这样做。另外,不建议您返回 POJO 类的对象作为响应。

因此,您可以选择任何一种方法,同时记住每种方法的缺点。


查看完整回答
反对 回复 2023-07-13
?
呼如林

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)。)


查看完整回答
反对 回复 2023-07-13
  • 6 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信