1

我在一个 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));
        }
    }

}
4

1 回答 1

0

我最终发现了问题。由于除了必须在 lombok.config 中打开的一个注释之外,注释都在工作,我假设 lombok.config 没有加载,并在 Lombok 中提取并测试了一些“冒泡”目录结构的代码找到 lombok.config 文件。

结论:冒泡不适用于具有 UNC 路径的文件夹。我不确定这是否是 Java 文件 IO 的限制或 Lombok 使用它的方式。我在 WSL 下的 Ubuntu 中有我的源代码,因此我的手动 Maven 构建是 Linux 的,这意味着在 \wsl$\Ubuntu 下设置 Eclipse 项目......这种路径格式无法在冒泡代码中存活。

解决方案是将 Windows 驱动器映射到 \wsl$\ 网络位置并删除并重新创建驱动器下的所有 Eclipse 项目,因此项目路径现在是 G:/... 而不是 \wsl$\Ubuntu...

于 2021-05-04T09:05:01.367 回答