我们在运行Lombok时遇到问题>1.18.18作为Eclipse代理(2022-06或v4.24.0(……它开始将JSR-303 Bean Validation约束复制到生成的setter中。我们很惊讶,因为这是不向后兼容的;注释以前没有注释的函数无疑是一个突破性的变化:/
这会混淆ApacheBVal实现(v2.0.5(,因为通常情况下不会同时注释字段和setter。实际上,我不知道jsr303规范是否允许这样做,但我猜测它是无效的,因为它不遵循DRY原则。
有一个配置密钥lombok.copyableAnnotations
来控制行为,但我们似乎无法让Eclipse/Lombok关心它
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
我们从未找到解决方案。我不认为龙目的默认行为既不安全也不有用;一些注释并不意味着同时用于字段和getters/ssetter,因为注释的含义发生了变化。对于龙目,这种行为应该是选择加入,而不是选择退出。
由于我们无法让忽略列表有效地工作,我们(叹气(最终分叉了龙目并移除了这一魔法。我们修改了src/core/lombok/core/handlers/HandlerUtil.java
,特别是将NONNULL_ANNOTATIONS
、BASE_COPYABLE_ANNOTATIONS
、COPY_TO_SETTER_ANNOTATIONS
、COPY_TO_BUILDER_SINGULAR_SETTER_ANNOTATIONS
和JACKSON_COPY_TO_BUILDER_ANNOTATIONS
都设置为空集合。
这实际上有一个副作用,即修复了一些JSON和XML绑定所困扰的其他一些错误。