问题描述
我在一个 Maven 项目中有下面的代码,它从命令行编译和运行(OpenJDK 15.0.2 在 Linux 的 Windows 子系统下运行在 Ubuntu 中)。它使用 Lombok 1.18.20 和相关 Jackson 库的 2.12.3 版。
Eclipse 20210312-0638 在 Windows OpenJDK 15.0.2 下运行(我与 Eclipse 内置 JRE 的行为相同,安装了 Windows JDK 以查看是否有帮助)。 Lombok 1.18.20 安装在 Eclipse 中(并显示在关于...对话框中)。
当我在 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 注释,但它在命令行版本中存在。构造函数、getter 和 setter 是由 @Value 注释在 Eclipse 版本中按预期创建的,因此 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));
}
}
}
解决方法
我终于找到了问题所在。由于除了必须在 lombok.config 中打开的一个注释之外,注释都在工作,我假设 lombok.config 没有加载,并在 Lombok 中提取并测试了一些“冒泡”目录结构的代码找到 lombok.config 文件。
结论:冒泡不适用于具有 UNC 路径的文件夹。我不确定这是 Java 文件 IO 的限制还是 Lombok 使用它的方式。我在 WSL 下的 Ubuntu 中有我的源代码,因此我的手动 Maven 构建是一个 Linux 版本,这意味着在 \wsl$\Ubuntu 下设置 Eclipse 项目......这种路径格式在冒泡代码中无法生存。
解决方案是将 Windows 驱动器映射到 \wsl$\ 网络位置并删除并重新创建驱动器下的所有 Eclipse 项目,因此项目路径现在是 G:/... 而不是 \wsl$\Ubuntu ...