将lombok @AllArgsConstructor与Spring启动MongoDb @持久性构造函数结合使用

rmbxnbpk  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(155)

我有一个spring-boot应用程序,它使用mongoDb数据库来存储对象。其中一个对象是ExampleDoc,如下所示:

package com.example;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import lombok.ToString;

import org.bson.types.ObjectId;

@ToString
@Document
public class ExampleDoc {
    
    @PersistenceConstructor
    public ExmapleDoc(ObjectId id, 
            String uniqueField,
            String field1,
            String field2) {
        this.id = id;
        this.uniqueField = uniqueField;
        this.field1 = field1;
        this.field2 = field2;
    }
    

    public ExmapleDoc() {}

    @Id
    @Getter @Setter @NonNull private ObjectId id;
    @Indexed(unique = true)
    @Getter @Setter @NonNull private String uniqueField;
    @Getter @Setter String field1
    @Getter @Setter String field2
}

我正在使用lombok来示例化字段沿着它们的getter和setter。目前有两个构造函数,一个将所有字段作为参数,另一个不接受参数。第二个不接受参数,当应用程序在数据库外部构造对象时使用。设置任何相关字段,然后加载文档,例如:

ExampleDoc exampleDoc = new ExampleDoc();
exampleDoc.setUniqueField("uniqueVal");
exampleDocRepository.save(exampleDoc);

持久化构造器用于从数据库中提取文档并将其转换为java对象,例如

ExampleDoc exampleDoc = exampleDocRepository.findById(objectId)

由于持久性构造函数接受所有参数,因此我想使用lombok的@AllArgsConstructor注解来避免显式添加此参数。
我尝试使用:

@ToString
@Document
@AllArgsConstructor
public class ExampleDoc {
    
    @PersistenceConstructor

    @Id
    @Getter @Setter @NonNull private ObjectId id;
    @Indexed(unique = true)
    @Getter @Setter @NonNull private String uniqueField;
    @Getter @Setter String field1
    @Getter @Setter String field2
}

但这并不起作用。有没有办法将两者结合起来,这样我就不必显式地创建一个列出所有字段的构造函数?

vxf3dgd4

vxf3dgd41#

根据https://projectlombok.org/features/constructor,要在生成的构造函数上添加注解,可以使用onConstructor=@__({@AnnotationsHere})
应该是这样

@AllArgsConstructor(onConstructor=@__({@PersistenceConstructor}))
public class ExampleDoc {
...
}

但您必须自行承担风险,因为此功能仍然是experimental
您可以使用onConstructor=@__({@AnnotationsHere}),但是要小心;这是实验性特征。

相关问题