问题
In Dropwizard I use @Valid annotations for my resource methods:
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");
}
...
}
}
On application start I register a custom WebApplicationExceptionMapper
which handles WebApplicationExceptions
. Thus, for addresses with the value null, the exception is thrown and handled in the mapper which generates a useful response. However, if the address is not null but street
is, Dropwizard automatically generates a response and sends it to the client (which I dislike).
How do I interfere this response so that in the end it is also handled by the mapper?
回答1:
Dropwizard registers their own constraint violation exception mapper which you can override.
Since Jersey does not yet support the @Priority
annotation on the exception mappers (https://java.net/jira/browse/JERSEY-2437), you should disable the registration of the Dropwizard's mappers before register your own. Here is an fragment of the Application's run method and an exception mapper:
@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) {
...
}
}
回答2:
In newer Dropwizard versions (for e.g. 0.9.2), I had to do:
env.jersey().register(new JsonProcessingExceptionMapper(true));
来源:https://stackoverflow.com/questions/29492359/how-to-change-the-validation-error-behaviour-for-dropwizard