具有多个值的 Spring Boot 自定义约束验证器

Mat*_*ley 2 java spring-boot

我想为自定义约束验证器添加 2 个值,因为我有 2 个功能标志:

 @JsonProperty(value = "name")
    @BlockedWithoutEnabledFeatureFlag(feature = FeatureFlag.AAA, values = {"aaa", "bbb"})
    @BlockedWithoutEnabledFeatureFlag(feature = FeatureFlag.BBB, values = {"ccc", "ddd"})
    private String parameter;
Run Code Online (Sandbox Code Playgroud)

在哪里:

@Constraint(validatedBy = {BlockedWithoutEnabledFeatureFlagValidator.class})
@Target({FIELD, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@ReportAsSingleViolation
public @interface BlockedWithoutEnabledFeatureFlag {

    String message() default "{validation.constraints.BlockedWithoutEnabledFeatureFlag.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    FeatureFlag feature();

    String[] values() default {};
}
Run Code Online (Sandbox Code Playgroud)

和实施:

public class BlockedWithoutEnabledFeatureFlagValidator implements ConstraintValidator<BlockedWithoutEnabledFeatureFlag, Object> {
    private final FeatureFlagService featureFlagService;

    private List<String> blocked;
    private FeatureFlag feature;

    @Override
    public void initialize(BlockedWithoutEnabledFeatureFlag constraintAnnotation) {
        blocked = Arrays.asList(constraintAnnotation.values());
        feature = constraintAnnotation.feature();
    }

@Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {

Run Code Online (Sandbox Code Playgroud)

但现在我收到编译错误“重复注释”。怎么做?

Yev*_*nov 5

你应该让你的BlockedWithoutEnabledFeatureFlag内容可重复。去做这个:

  1. 创建一个新的“顶级”注释:
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatableBlockedWithoutEnabledFeatureFlag {
    BlockedWithoutEnabledFeatureFlag[] value();
}
Run Code Online (Sandbox Code Playgroud)
  1. 将 @Repeatable 添加到您的 BlockedWithoutEnabledFeatureFlag 注释中
...
@Repeatable(RepeatableBlockedWithoutEnabledFeatureFlag.class)
public @interface BlockedWithoutEnabledFeatureFlag {
...
Run Code Online (Sandbox Code Playgroud)

那么您应该能够添加多个@BlockedWithoutEnabledFeatureFlag注释。