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

如何为Lombok实现的Example类添加双字段至少非空其一的约束?

给Example类添加「至少一个字段非空」的约束

当然可以实现这个需求,下面是几种常用的方案,能确保创建Example实例时,maybeA和maybeB不会同时为空:

方案1:自定义构造器做校验

因为你用了@Builder,它会调用类的构造器来创建实例,所以可以手动编写构造器并加入校验逻辑,替代@RequiredArgsConstructor自动生成的构造器:

@Getter
@Builder
class Example {
    private final String maybeA;
    private final String maybeB;

    // 手动实现构造器,加入非空校验
    private Example(String maybeA, String maybeB) {
        if (maybeA == null && maybeB == null) {
            throw new IllegalArgumentException("maybeA和maybeB不能同时为空");
        }
        this.maybeA = maybeA;
        this.maybeB = maybeB;
    }
}

这样无论是通过Example.builder().build()还是直接反射调用构造器,只要两个字段都为空就会抛出异常,从根源上阻止无效实例的创建。

方案2:自定义Builder的build方法

如果不想改动构造器,可以在Builder类里重写build()方法,在返回实例前做校验:

@Getter
@Builder
@RequiredArgsConstructor
class Example {
    private final String maybeA;
    private final String maybeB;

    // 自定义Builder的build逻辑
    public static class ExampleBuilder {
        @Override
        public Example build() {
            Example example = super.build();
            if (example.getMaybeA() == null && example.getMaybeB() == null) {
                throw new IllegalArgumentException("maybeA和maybeB至少要有一个不为空");
            }
            return example;
        }
    }
}

这种方式保留了@RequiredArgsConstructor的作用,同时只针对Builder创建实例的场景做校验。

方案3:用Bean Validation做声明式校验

如果你的项目使用了Bean Validation(比如Spring生态中的校验框架),可以用@AssertTrue注解实现声明式校验:

import javax.validation.constraints.AssertTrue;

@Getter
@Builder
@RequiredArgsConstructor
class Example {
    private final String maybeA;
    private final String maybeB;

    // 校验方法,返回true表示校验通过
    @AssertTrue(message = "maybeA和maybeB至少要有一个不为空")
    public boolean isAtLeastOneFieldPresent() {
        return maybeA != null || maybeB != null;
    }
}

使用时需要通过Validator实例触发校验,比如在接收请求参数时加上@Valid注解,框架会自动校验对象合法性。这种方式适合需要在业务流程中统一做校验的场景。

内容的提问来源于stack exchange,提问作者user18375257

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:35:54