首页 > 解决方案 > 忽略在 Json 对象中传递的字段

问题描述

我有一个 POJO User,它也被用于在 MongoDb 中插入文档。

@Data
@Document(collection = Constants.COLLECTION_USERS)
public class User {

    public ObjectId _id;

    public String userID;

    public String email;

    public String name;

    public String sex;

    public String dob;

    public String photo;
    //have more variables

}

我有一个简单的应用程序,用户通过提供类中列出的数据子集进行注册User。我的控制器中注册方法的签名如下。

public GenericResponse registerUser(@RequestBody User userRegistrationRequest)

可以注意到我在注册请求中使用了相同的 POJO。直到现在一切都很好。我可以很好地保留数据用户对象。

此注册 API 仅用于保存一小组用户数据。MongoDb 文档中还有其他信息,可以从其他一些 API 访问/保留这些信息。

假设用户已经注册了基本信息,并且还通过注册以外的 API 保存了其他信息。

我将如何制作一个 API,它可以User使用相同的 User Pojo 再次从文档中获取一些选择性数据?如果我调用存储库以提供特定用户 ID 的数据,它将为我提供映射到 User 类的整个文档。我不希望我的 API 提供存储在文档中的所有信息。

一种方法是使用我想要的详细信息制作另一个 POJO,并使用Converter. 但是,我想避免这种方法,因为我想使用同一个类。

第二种方法:修改 Mongo 查询以选择性地返回数据,如文档中给出的。但是在这里我必须在结果集中指定我想要的所有字段。这又是一个长度查询。

有没有更好的方法从对象中过滤掉数据?

标签: javamongodbspring-bootspring-data

解决方案


我将如何制作一个 API,它可以使用相同的用户 Pojo 再次从用户文档中获取一些选择性数据?

晚上我想带我女孩去餐厅,我怎么开车去越野?我不会——如果我的所有东西都用同一辆车,我会在餐厅旁边看起来很愚蠢,在套房里出来,或者我会陷入沼泽。

Java 最大的优势是对象创建时间——你不应该害怕它。只需创建另一个用于注册的模型,另一个作为 DTO 用于保存数据,另一个用于前端演示等

永远不要混合对象的责任。你会完成类似的东西

@Entity
class ThePileOfShit {
    @Id
    private Long id;

    @my.audit.framework.Id
    private String anotherId;

    @JsonIgnore
    // just a front-end flag ignore
    private boolean flag;

    @Column
    // not a field but getter because of any-weird-issue-you-want-to-put-here
    public String getWeirdStuff() { ... }

    // Useless converters
    public ModelA getAsModelA() { ... }

    public ModelB getAsModelB() { ... }

    // etc
    // etc
}

四种框架,五种技术——没有人知道发生了什么。

如果您害怕转换东西,请使用ModelMapper或其他工具,但要让您的 POJO 尽可能简单


推荐阅读