如何阻止Eclipse中Lombok将注解复制到Getter/Setter方法?
解决Lombok复制JSR-303约束到Setter导致Apache BVal ClassCastException的问题
问题背景
在Eclipse 2022-06(v4.24.0)环境中使用Lombok 1.18.18及以上版本时,Lombok会自动将字段上的JSR-303 Bean Validation约束(如@NotNull)复制到生成的Setter方法参数上。该行为破坏了向后兼容性,直接导致Apache BVal v2.0.5抛出ClassCastException。
已尝试的无效方案
在项目根目录创建lombok.config文件并配置以下内容,但问题未得到解决:
config.stopBubbling = true lombok.copyableAnnotations =
通过javap反编译class文件可见,Setter参数上仍保留了@NotNull注解:
public void setUserName(java.lang.String); descriptor: (Ljava/lang/String;)V flags: (0x0001) ACC_PUBLIC RuntimeVisibleParameterAnnotations: parameter 0: 0: #26() javax.validation.constraints.NotNull // 其余字节码省略
异常堆栈跟踪:
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
可行解决方案
方案1:全局禁用Setter注解复制(推荐)
修改lombok.config文件,添加针对Setter的专属配置,确保Lombok不会将字段注解复制到Setter参数:
config.stopBubbling = true # 清空全局可复制注解列表 lombok.copyableAnnotations = # 单独指定Setter不复制任何注解(优先级高于全局配置) lombok.setter.copyableAnnotations =
配置完成后:
- 重启Eclipse以加载新配置
- 执行Project > Clean清理旧编译文件
- 重新编译项目,再次用
javap验证Setter参数上的JSR-303注解是否已移除
方案2:局部禁用单个字段的注解复制
如果不需要全局禁用,可在特定字段上通过@Setter的copyAnnotations属性单独控制:
import lombok.Setter; import javax.validation.constraints.NotNull; public class LoginPage { @Setter(copyAnnotations = false) @NotNull private String userName; }
该配置仅对当前字段的Setter生效,不会影响其他字段。
方案3:升级Lombok版本
部分Lombok 1.18.x版本存在注解复制的逻辑bug,升级到Lombok 1.18.22及以上版本可能修复该问题,同时保留原有lombok.config配置即可。
方案4:升级Apache BVal版本
如果无法修改Lombok配置,可尝试将Apache BVal升级到v2.0.6及以上版本,该版本已修复处理重复注解时的ClassCastException问题。
内容的提问来源于stack exchange,提问作者Jonathan S. Fisher
相关产品推荐
相关产品推荐

