You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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 =

配置完成后:

  1. 重启Eclipse以加载新配置
  2. 执行Project > Clean清理旧编译文件
  3. 重新编译项目,再次用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:48:23