Java DropWizard非平凡配置验证

Java DropWizard非平凡配置验证,java,configuration,dropwizard,bean-validation,javax.validation,Java,Configuration,Dropwizard,Bean Validation,Javax.validation,我有一个DropWizard配置类,它有两个属性。 必须至少设置一个。 这意味着,两者都是@Nullable,我需要对整个对象进行验证 public class MessagingStreamConfiguration extends Configuration { @Nullable private URL baseUrl; @Nullable private LinkedHashMap<String, U

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

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

        @Nullable
        private LinkedHashMap<String, URL> baseUrls;
    }
我为此设置了一个
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.";
}
/**
*非平凡案例的附加验证。
*/
私有布尔值isValid(){
返回(this.getBaseUrl()==null
&&(this.getBaseUrls()==null | | this.getBaseUrls().isEmpty());
}
/**
*javax.validation是验证整个类的一种方法。
*/
公共静态类MessagingStreamConfigurationValidator实现ConstraintValidator
{
@凌驾
公共无效初始化(MessagingStreamConfigurationValid ConstraintAnotation){
}
@凌驾
公共布尔值有效(MessagingStreamConfiguration conf、ConstraintValidatorContext上下文){
返回conf.isValid();
}
}
@约束(validatedBy={MessagingStreamConfigurationValidator.class})
@目标({ElementType.TYPE})
@保留(值=RetentionPolicy.RUNTIME)
public@interface MessagingStreamConfigurationValid
{
字符串消息()默认值“未设置baseUrl和baseUrl。请设置baseUrl。”;
}
但对象的验证不会发生。只有一个单独的字段

也只处理字段。
DW文档非常有用

如何使DropWizard验证整个对象?

您有两个选项:

  • 使用自定义注释(
    MessagingStreamConfigurationValid
    )注释要验证的类(
    ClaConfiguration
  • 在注释中,以
    ElementType.FIELD
    为目标,并使用自定义注释而不是
    @Valid
请注意,您需要在注释中添加以下内容才能使其正常工作:

  • Class[]groups()默认值{}

  • ClassInterest,我认为组和负载是特定于示例的。现在我看到它们确实是需要的。我会努力的。
    
    /**
     * 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.";
    }