【问题标题】:DropWizard non-trivial configuration validationDropWizard 非平凡配置验证
【发布时间】:2018-11-16 18:23:12
【问题描述】:

我有一个 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 验证整个对象?

【问题讨论】:

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


    【解决方案1】:

    你有两个选择:

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

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

    • Class&lt;?&gt;[] groups() default { };
    • Class&lt;? extends Payload&gt;[] payload() default { };

    【讨论】:

    • 有趣,我认为组和有效负载是特定于示例的。现在我看到它们实际上是需要的。会试试的。
    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多