【问题标题】:How to stop lombok from copying annotations to getters/setters in Eclipse?如何阻止 lombok 在 Eclipse 中将注释复制到 getter/setter?
【发布时间】:2022-10-24 20:04:16
【问题描述】:

我们在运行 Lombok > 1.18.18 作为 Eclipse 代理(2022-06 或 v4.24.0)时遇到问题......它开始将 JSR-303 Bean Validation 约束复制到生成的设置器。我们很惊讶,因为这不向后兼容。注释以前未注释的函数绝对是一个重大变化:/

这会混淆 Apache BVal 实现(v2.0.5),因为通常您不会同时注释字段和设置器。我实际上不知道 jsr303 规范是否允许这样做,但我的猜测是它是无效的,因为它不遵循 DRY 原则。

有一个配置键lombok.copyableAnnotations 来控制行为,但我们似乎无法让 Eclipse/Lombok 关心它。我们在项目根目录中放置了一个 lombok.config,内容如下:

config.stopBubbling = true
lombok.copyableAnnotations =

它是仍然复制注释:

// output of `javap -v -p -l -constants FileName.class`
  public void setUserName(java.lang.String);
    descriptor: (Ljava/lang/String;)V
    flags: (0x0001) ACC_PUBLIC
    RuntimeVisibleParameterAnnotations:
      parameter 0:
        0: #26()
          javax.validation.constraints.NotNull
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: putfield      #66                 // Field userName:Ljava/lang/String;
         5: return
      LineNumberTable:
        line 43: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lcom/xxx/xxx/xxx/xxx/xxx/xxx/LoginPage;
            0       6     1 userName   Ljava/lang/String;
    RuntimeVisibleTypeAnnotations:
      0: #26(): METHOD_FORMAL_PARAMETER, param_index=0
        javax.validation.constraints.NotNull
    MethodParameters:
      Name                           Flags
      userName                       final

任何防止这种情况的帮助将不胜感激!谢谢!

编辑

原始堆栈跟踪:

Caused by: java.lang.ClassCastException: class org.apache.bval.jsr.descriptor.ComposedD$ForProperty cannot be cast to class org.apache.bval.jsr.descriptor.ElementD (org.apache.bval.jsr.descriptor.ComposedD$ForProperty and org.apache.bval.jsr.descriptor.ElementD are in unnamed module of loader java.net.URLClassLoader @1fbc7afb)
    at org.apache.bval.jsr.job.ValidateProperty$DescriptorWrapper.<init>(ValidateProperty.java:159)
    at org.apache.bval.jsr.job.ValidateProperty$FindDescriptor.handleProperty(ValidateProperty.java:219)
    at org.apache.bval.jsr.job.ValidateProperty$WalkGraph.handleProperty(ValidateProperty.java:312)
    at org.apache.bval.jsr.util.PathNavigation$PathPosition.handleProperty(PathNavigation.java:324)
    at org.apache.bval.jsr.util.PathNavigation.parse(PathNavigation.java:218)
    at org.apache.bval.jsr.util.PathNavigation.navigateAndReturn(PathNavigation.java:176)
    ... 86 more

【问题讨论】:

    标签: java eclipse lombok bean-validation


    【解决方案1】:

    我们从未找到解决此问题的方法。我不相信 Lombok 的默认行为既不安全也不有用。一些注释不意味着用于两个领域getter/setter 同时,因为注解改变了含义。对于 Lombok,这种行为应该是选择加入,而不是选择退出。

    由于我们无法让忽略列表有效地工作,我们(叹息)最终分叉了 Lombok 并删除了这个魔法。我们修改了src/core/lombok/core/handlers/HandlerUtil.java,将NONNULL_ANNOTATIONSBASE_COPYABLE_ANNOTATIONSCOPY_TO_SETTER_ANNOTATIONSCOPY_TO_BUILDER_SINGULAR_SETTER_ANNOTATIONSJACKSON_COPY_TO_BUILDER_ANNOTATIONS全部设置为空集合。

    这实际上具有修复一些其他错误的副作用,我们被一些 JSON 和 XML 绑定所困扰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2010-11-03
      • 1970-01-01
      • 2019-10-08
      • 2010-11-04
      相关资源
      最近更新 更多