基于同一rqtDto类实现多微服务差异化字段校验方案咨询
解决方案
核心复用JSR-380(Bean Validation)原生的分组校验能力,无需自定义校验注解、无需创建子类、完全兼容原有主微服务的全量校验逻辑,实现步骤如下:
步骤1:公共父库新增下游微服务专属校验分组
Bean Validation的校验分组本身就是空标记接口,直接在公共父库为每个下游微服务定义独立的分组即可:
// 公共父库统一维护,可随时新增下游服务对应的分组 public interface SecondMicroserviceGroup {} public interface ThirdMicroserviceGroup {}
步骤2:为rqtDto字段的校验注解追加对应服务分组
仅给需要在对应下游微服务校验的字段的所有校验注解的groups属性,追加对应微服务的分组即可,不需要校验的字段无需修改:
@Getter @Setter @SuperBuilder @NoArgsConstructor @AllArgsConstructor @GroupSequence({ Security.class, Validations.class, Functionals.class, rqtDto.class }) public class rqtDto { /** * Unique Identifier. */ @CyberSecurity(groups = {Security.class, SecondMicroserviceGroup.class}) @NotBlank(groups = {Validations.class, SecondMicroserviceGroup.class}, message = "blank") @Size(min = 0, max = 32, groups = {Validations.class, SecondMicroserviceGroup.class}, message = "invalid data") @myId(groups = {Functionals.class, SecondMicroserviceGroup.class}) private String myId; // 该字段不需要在第二个微服务校验,groups不追加SecondMicroserviceGroup即可 @CyberSecurity(groups = Security.class) @NotNull(groups = Validations.class, message = "is null") @Enumeration(enumClazz = MyEnum.class, groups = Functionals.class, message = "not allowed") private String enumResult; // 其余字段逻辑同上 @Builder.Default @CyberSecurity(groups = Security.class) @Enumeration(enumClazz = EnumValidation.class, groups = Functionals.class, message = "not allowed") private String myEnumValidation = EnumValidation.ALL.getCode(); @Valid @NotEmpty(groups = Validations.class, message = "empty") private Collection<ClientsDto> clients; }
步骤3:各微服务指定对应分组执行校验
校验时传入指定的分组即可实现按需校验:
- 主微服务全量校验:依旧传入原有三个分组
Security.class、Validations.class、Functionals.class,原有逻辑完全无侵入 - 第二个下游微服务校验:仅传入
SecondMicroserviceGroup.class,只会触发加了该分组的字段的校验规则 - 其余下游微服务按同理传入自身对应的分组即可
可选灵活方案
如果不想在公共父库提前预定义所有下游服务的分组,可采用编程式校验:在下游微服务本地维护需要校验的字段列表,通过Validator类的API手动遍历指定字段执行校验,无需修改公共父库的rqtDto代码。
内容的提问来源于stack exchange,提问作者Alvaro García
相关产品推荐
相关产品推荐

