Как изменить поведение ошибки проверки для Dropwizard?
В Dropwizard я использую аннотации @Valid для своих методов ресурсов:
public class Address {
@NotNull
String street
...
}
@Path("/address")
@Produces(MediaType.APPLICATION_JSON)
public class AddressResource {
@POST
public MyResponse addAddress(@Valid Address address) {
if (address == null) {
throw new WebApplicationException("address was null");
}
...
}
}
При запуске приложения я регистрирую кастом WebApplicationExceptionMapper
какие ручки WebApplicationExceptions
, Таким образом, для адресов со значением null исключение генерируется и обрабатывается в преобразователе, который генерирует полезный ответ. Тем не менее, если адрес не является нулевым, но street
есть, Dropwizard автоматически генерирует ответ и отправляет его клиенту (что мне не нравится).
Как мне помешать этому ответу, чтобы в конце он также был обработан картографом?
2 ответа
Dropwizard регистрирует собственный сопоставитель исключений нарушений ограничений, который вы можете переопределить.
Поскольку Джерси еще не поддерживает @Priority
аннотации для картографов исключений ( https://java.net/jira/browse/JERSEY-2437), вы должны отключить регистрацию картографов Dropwizard, прежде чем зарегистрировать свою собственную. Вот фрагмент метода запуска приложения и средства отображения исключений:
@Override
public void run(
final Configuration config,
final Environment environment) throws Exception {
((DefaultServerFactory)config.getServerFactory()).setRegisterDefaultExceptionMappers(false);
// Register custom mapper
environment.jersey().register(new MyConstraintViolationExceptionMapper());
// Restore Dropwizard's exception mappers
environment.jersey().register(new LoggingExceptionMapper<Throwable>() {});
environment.jersey().register(new JsonProcessingExceptionMapper());
environment.jersey().register(new EarlyEofExceptionMapper());
...
}
@Provider
public class MyConstraintViolationExceptionMapper
implements ExceptionMapper<ConstraintViolationException> {
@Override
public Response toResponse(ConstraintViolationException exception) {
...
}
}
В более новых версиях Dropwizard (например, 0.9.2) мне приходилось делать:
env.jersey().register(new JsonProcessingExceptionMapper(true));