【问题标题】:Is there a way to persist a field but when performing a GET the field isn't serialized [duplicate]有没有办法保留一个字段但是在执行 GET 时该字段没有序列化[重复]
【发布时间】:2021-04-24 10:56:44
【问题描述】:

所以,我想用password 字段保留一个用户,但我不想显示返回 password。不知何故,我只想序列化该字段以保持不变,但在 findById(id)findAll() 此字段不得显示。 用户将填写的字段:

{
    "firstName" : "foo",
    "lastName" : "bar",
    "password" : "MyNewPass",
    "email": "john@doe.net"
}

我将持久化的数据:

{
    "id": "1",
    "firstName" : "foo",
    "lastName" : "bar",
    "email": "john@doe.net",
    "password" : "$2y$12$0bpN8aTD5WebsGWoXK90yuJcDczNmUIAOduWXoHKfEw7GOidpQX1u",
    "createdDate": "01/01/2077",
    "active": "false"
}

我希望用户(前端)看到的响应:

{
    "id": "1",
    "firstName" : "foo",
    "lastName" : "bar",
    "email": "john@doe.net",
    "active": "false"
}

如果我删除getPassword(),我将无法验证登录会话,因为我需要在内部检查密码哈希。我可以创建 3 个不同的类,但是会有很多重复的代码。

对于这种情况有更好的方法吗?遗产?某种注释?接口?我失去了什么?

我目前正在处理的 Repo:customer-service

【问题讨论】:

  • 你能显示对象的类定义吗?你用什么库来序列化它?
  • 我正在使用 JAX-RS 并且 Class Def 是我坚持的数据的中间部分,目前我正在手动将我不想显示的字段设置为 null 它们所在的位置调用。
  • @JsonIgnore 工作吗?
  • 可以,但是当我需要从数据库中检索用户的信息时,password 字段会被忽略,所以我无法与用户的输入进行比较以检查他是否输入了有效的密码。跨度>
  • 这样的话,就是骗人的!现在打烊了……

标签: java postgresql jpa jax-rs quarkus


【解决方案1】:

你可能有一个看起来像这样的实体:

@Entity
public class User {
    private Long id;
    private String firstName;
    private String lastName;
    private String password;
    private LocalDate createdDate;
    private String email;
    private boolean active;

    // Getters and setters
}

您可以将此实体映射到专门用于 Web 请求的 User 类:

public class UserResponse {
    private Long id;
    private String firstName;
    private String lastName;
    private String email;
    private boolean active;
}

您可以手动将 User 映射到 UserResponse 或使用 MapStruct 之类的映射框架。

这比添加可能为您工作的注释要干净得多。 Entity 类应该用于持久性,并且不应该被附加责任所污染。

【讨论】:

  • 目前我有 3 个类,UserDTOUserResponseUserRegisterRequest,我能够通过这 3 个类保持所需的行为,但你看,它们共享一半以上在每个属性中,我想要的只是从重复的内容中“清理我的代码”。如果你想检查的话,我在主要步骤中添加了我正在处理的 repo。
  • @JohnnesSouza 删除相同的部分与“清理代码”不同。通常情况恰恰相反——即当它将一个物体的进化与另一个物体的进化联系起来时。如果您删除重复的代码并到达对数据库的更改溢出到您的 REST api 的地方,那么删除会使代码更脏,而不是更干净。这可能是一个很好的权衡(有时我们更喜欢“短”而不是“干净”),但重要的是要理解这是一个权衡,而不是一个好的做法。
  • @fdreger 我很清楚清洁代码的想法,而且我知道这与删除代码无关,我只是以错误的方式表达了自己。重构的主要思想是去除重复代码是为了充分利用OOP结构提供更好的代码。我可以以 N 种方式实现所需的行为,但保持简单并不像应该的那样容易;/。无论如何,谢谢你的呐喊。
  • 为什么不使用 Quarkus security jpa 为您做安全工作?这样你就不用太担心密码了。
  • 你说得对,Robert,我完全同意,但我来自 Spring 环境,这个项目是我了解更多关于这个新堆栈/框架的一种方式。这就是我使用 spring-jpa 作为依赖项的原因之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多