DropWizard非凡的配置验证

时间:2018-11-14 18:08:45

标签: java configuration dropwizard bean-validation javax.validation

我有一个DropWizard配置类,它具有两个属性。 必须至少设置一个。 也就是说,两者都是@Nullable,我需要对整个对象进行验证。

    public class MessagingStreamConfiguration extends Configuration
    {
        @Nullable
        private URL baseUrl;

        @Nullable
        private LinkedHashMap<String, URL> baseUrls;
    }

此配置类是整个应用程序配置的属性。

public class ClaConfiguration extends Configuration
{
    @Valid
    @JsonProperty("messagingStream")
    private MessagingStreamConfiguration messagingStreamConfiguration;

我为此设置了一个javax.validation

/**
 * Additional validation for non-trivial cases.
 */
private boolean isValid() {
    return (this.getBaseUrl() == null
        && (this.getBaseUrls() == null || this.getBaseUrls().isEmpty()));
}


/**
 * javax.validation way of validating the whole class.
 */
public static class MessagingStreamConfigurationValidator implements ConstraintValidator<MessagingStreamConfigurationValid, MessagingStreamConfiguration>
{
    @Override
    public void initialize(MessagingStreamConfigurationValid constraintAnnotation) {

    }

    @Override
    public boolean isValid(MessagingStreamConfiguration conf, ConstraintValidatorContext context) {
        return conf.isValid();
    }
}

@Constraint(validatedBy = {MessagingStreamConfigurationValidator.class})
@Target({ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MessagingStreamConfigurationValid
{
    String message() default "Neither baseUrl nor baseUrls is set. Set baseUrls.";
}

但是该对象的验证没有发生。只是单个字段。

only relevant DropWizard tests I found2nd也仅处理字段。
DW文档doesn't talk about config validation很多。

如何使DropWizard验证整个对象?

1 个答案:

答案 0 :(得分:3)

您有两个选择:

  • 使用自定义注释(ClaConfiguration)对要验证的类(MessagingStreamConfigurationValid)进行注释
  • 在注释中,定位ElementType.FIELD,并使用自定义注释而不是@Valid注释字段

请注意,您需要在注释中使用two more attributes才能使其正常工作:

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