2015-03-02 1 views
6

Поэтому я хочу изменить сообщения проверки, используемые для проверки модели с помощью ресурса DropWizard.Переопределение сообщения DropWizard ConstraintViolation

Я использую аннотации проверки java bean. Например, вот одно из полей, которое я хочу подтвердить:

@NotEmpty(message = "Password must not be empty.") 

Я могу проверить это, как ожидается, с помощью валидатора.

Однако, когда я использую DropWizard для выполнения проверки на ресурсе, он добавляет дополнительные сообщения к этому сообщению. То, что я вижу, это - password Password must not be empty. (was null), и я нашел код, который делает это здесь - https://github.com/dropwizard/dropwizard/blob/master/dropwizard-validation/src/main/java/io/dropwizard/validation/ConstraintViolations.java

В частности, этот метод -

public static <T> String format(ConstraintViolation<T> v) { 
    if (v.getConstraintDescriptor().getAnnotation() instanceof ValidationMethod) { 
     final ImmutableList<Path.Node> nodes = ImmutableList.copyOf(v.getPropertyPath()); 
     final ImmutableList<Path.Node> usefulNodes = nodes.subList(0, nodes.size() - 1); 
     final String msg = v.getMessage().startsWith(".") ? "%s%s" : "%s %s"; 
     return String.format(msg, 
          Joiner.on('.').join(usefulNodes), 
          v.getMessage()).trim(); 
    } else { 
     return String.format("%s %s (was %s)", 
          v.getPropertyPath(), 
          v.getMessage(), 
          v.getInvalidValue()); 
    } 
} 

Есть ли способ, что я могу изменить это поведение? Я просто хочу отобразить сообщение, которое я установил в аннотации ...

ответ

5

ConstraintViolationExceptionMapper - тот, который использует этот метод. Чтобы отменить его, вам необходимо отменить его регистрацию и зарегистрировать свой собственный ExceptionMapper.

Удалите картограф исключения (ы)

Dropwizard 0.8

добавьте следующую строку в файл YAML. Обратите внимание, что он удалит все фильтры-исключения по умолчанию, которые добавляет dropwizard.

server: 
    registerDefaultExceptionMappers: false 

Dropwizard 0.7.x

environment.jersey().getResourceConfig().getSingletons().removeIf(singleton -> singleton instanceof ConstraintViolationExceptionMapper); 

Создать и добавить свой собственный картографа исключение

public class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> { 

    @Override 
    public Response toResponse(ConstraintViolationException exception) { 
     // get the violation errors and return the response you want. 
    } 
} 

и добавить исключение картографа в своем классе приложений.

public void run(T configuration, Environment environment) throws Exception { 
    environment.jersey().register(ConstraintViolationExceptionMapper.class); 
} 
+0

Мне нравится [ответ Лукаш Wiktor в] (http://stackoverflow.com/a/30799426/1891566) лучше, потому что он повторно instates других картографов исключением того, что первым шагом в этом ответ удаляет, эффективно меняет * только обработчик для 'ConstraintValidationException' * –

6

Вот программный раствор в dropwizard 0,8:

public void run(final MyConfiguration config, final Environment env) { 
    AbstractServerFactory sf = (AbstractServerFactory) config.getServerFactory(); 
    // disable all default exception mappers 
    sf.setRegisterDefaultExceptionMappers(false); 
    // register your own ConstraintViolationException mapper 
    env.jersey().register(MyConstraintViolationExceptionMapper.class) 
    // restore other default exception mappers 
    env.jersey().register(new LoggingExceptionMapper<Throwable>() {}); 
    env.jersey().register(new JsonProcessingExceptionMapper()); 
    env.jersey().register(new EarlyEofExceptionMapper()); 
} 

Я думаю, что это более надежно, чем в конфигурационном файле. И, как вы можете видеть, это также позволяет вернуть все остальные default exception mappers.

+1

Это должен быть принятый ответ, так как текущий удаляет больше экземпляров исключений, чем то, что запросили ОП. –