Как изменить поведение ошибки проверки для 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));

Другие вопросы по тегам