代码之家  ›  专栏  ›  技术社区  ›  Ondra Žižka David Lilljegren

DropWizard非平凡配置验证

  •  1
  • Ondra Žižka David Lilljegren  · 技术社区  · 7 年前

    我有一个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 found , 2nd 也只处理字段。
    数据仓库文档 doesn't talk about config validation 很多。

    如何使dropwizard验证整个对象?

    1 回复  |  直到 7 年前
        1
  •  3
  •   vin59    7 年前

    你有两个选择:

    • 注释要验证的类( ClaConfiguration )使用自定义批注( MessagingStreamConfigurationValid )
    • 在你的注释中,target ElementType.FIELD ,并使用自定义注释而不是 @Valid

    请注意你需要 two more attributes 在您的注释中让它工作:

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