未在默认构造函数中初始化的变量

Variable not initialized in default constructor

我有这个class:

import lombok.Data;

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

// tag::code[]
@Data
@Document
public class Image {

    @Id final private String id;
    final private String name;
}
// end::code[]

我的理解是 @Data 应该默认为所有 final 字段创建一个构造函数。但是,当我 运行 我的应用程序出现此错误时:

error: variable id not initialized in the default constructor
        @Id final private String id;

为什么会这样?

My understanding is that @Data should create a constructor for all final fields by default. Error: variable id not initialized in the default constructor @Id final private String id; Why would this be happening?

是的!你是对的! @Data注解为final字段生成参数化构造函数,为所有非final字段生成setter,为两种类型的字段生成getter。

在您的情况下,您生成的构造函数应该如下所示,

public Image(Long id, String name) {
    this.id = id;
    this.name = name;
}

//getters for both fields

由于您的构造函数无法初始化最终字段 - 似乎 Lombok 未正确设置 - 您可以通过检查 target/classes 目录中的 Image.class 来验证它相同的包(就像你在 src 中拥有的一样,除了你已经通过配置文件 明确定义了位置)。如果未生成,请验证您的依赖项、Lombok 插件,您可能需要探索 Lombok configuration 以进行进一步设置。

您可以使用@RequiredArgsConstructor

我遇到了同样的问题,看来我在安装过程中没有将 annotationProcessorPath 添加到 lombok,类似于@runnerpaul 提到的。

             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>