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

run*_*aul 7 java constructor default-constructor lombok spring-boot

我有这门课:

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[]
Run Code Online (Sandbox Code Playgroud)

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

error: variable id not initialized in the default constructor
        @Id final private String id;
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

Đor*_*vić 8

我遇到了同样的问题,看来我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>
Run Code Online (Sandbox Code Playgroud)


She*_*Rai 5

我的理解是 @Data 默认情况下应该为所有最终字段创建一个构造函数。错误:变量 id 未在默认构造函数中初始化@Id final private String id;为什么会发生这种情况?

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

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

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

//getters for both fields
Run Code Online (Sandbox Code Playgroud)

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

  • 我将 `annotationProcessor 'org.projectlombok:lombok:1.18.10'` 添加到我的 `build.gradle` 依赖项中。问题现在似乎已经解决了。谢谢你的解释。这是一个很大的帮助。 (7认同)