我在一个 Maven 项目中有以下代码,该项目从命令行编译和运行(OpenJDK 15.0.2 在 Ubuntu 下的 Windows 子系统 Linux 下运行)。它使用相关 Jackson 库的 Lombok 1.18.20 和 2.12.3 版本。
Eclipse 20210312-0638 在 Windows OpenJDK 15.0.2 下运行(我对 Eclipse 内置 JRE 有相同的行为,安装了 Windows JDK 以查看它是否有帮助)。Lombok 1.18.20 安装在 Eclipse 中(并显示在 About... 对话框中)。
当我在 Eclipse 中将下面的类作为 Java 应用程序运行时,我得到:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `lomboktest.Main$Input` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
我已经反编译了由命令行 Maven 构建和在 Eclipse 中运行 Maven 更新创建的类文件。Eclipse 版本缺少@ConstructorProperties 注释,但它存在于命令行版本中。正如 Eclipse 版本中所预期的那样,@Value 注释正在创建构造函数、getter 和 setter,因此 Lombok 在某种程度上完成了这项工作。
我在项目的根目录中有 lombok.config:
lombok.anyConstructor.addConstructorProperties = true
config.stopBubbling = true
如果我使用 @ConfigurationProperties 注释添加一个显式的全参数构造函数,那么在 Eclipse 中一切运行正常。
我不知道在哪里寻找差异。我已经修改了可以在 Eclipse 中找到的任何与注释相关的设置,但没有成功。我看过一些关于影响 Lombok 注释的模块依赖项的帖子,但我没有(故意)使用模块。
任何人都可以建议我需要做什么才能在 Eclipse 中工作,或者至少我接下来可以调查一些事情来找出问题所在?
package lomboktest;
import java.io.InputStream;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import lombok.Value;
public class Main {
@Value
public static class Input
{
private String a;
private String b;
}
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
try (InputStream input = Main.class.getResourceAsStream("/input.yml"))
{
System.out.println(mapper.readValue(input, Input.class));
}
}
}