Нетривиальная проверка конфигурации DropWizard

У меня есть класс конфигурации 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.";
}

Но проверки объекта не происходит. Только его отдельных полей.

Только соответствующие тесты DropWizard, которые я нашел, 2nd также имеет дело только с полями.
Документация DW много не говорит о проверке конфигурации.

Как заставить DropWizard проверять весь объект?


person Ondra Žižka    schedule 14.11.2018    source источник


Ответы (1)


У вас есть два варианта:

  • аннотируйте проверяемый класс (ClaConfiguration) своей пользовательской аннотацией (MessagingStreamConfigurationValid)
  • в своей аннотации нацельтесь на ElementType.FIELD и аннотируйте свое поле своей пользовательской аннотацией вместо @Valid

Обратите внимание, что вам необходимо еще два атрибута в вашей аннотации, чтобы заставить его работать:

  • Class<?>[] groups() default { };
  • Class<? extends Payload>[] payload() default { };
person vin59    schedule 16.11.2018
comment
Интересно, я думал, что группы и полезная нагрузка зависят от примера. Теперь я вижу, что они действительно нужны. Попытаюсь. - person Ondra Žižka; 19.11.2018