如何为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
相关产品推荐
相关产品推荐

