如何更改 Dropwizard 的验证错误行为?
How to change the Validation Error behaviour for 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");
}
...
}
}
在应用程序启动时,我注册了一个处理 WebApplicationExceptions
的自定义 WebApplicationExceptionMapper
。因此,对于值为 null 的地址,将抛出异常并在生成有用响应的映射器中进行处理。但是,如果地址不为空但 street
为空,Dropwizard 会自动生成响应并将其发送到客户端(我不喜欢)。
我如何干预此响应,以便最终它也由映射器处理?
Dropwizard 注册了自己的约束违反异常映射器,您可以覆盖它。
由于 Jersey 尚不支持异常映射器 (https://java.net/jira/browse/JERSEY-2437) 上的 @Priority
注释,您应该在注册自己的映射器之前禁用 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));
在 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");
}
...
}
}
在应用程序启动时,我注册了一个处理 WebApplicationExceptions
的自定义 WebApplicationExceptionMapper
。因此,对于值为 null 的地址,将抛出异常并在生成有用响应的映射器中进行处理。但是,如果地址不为空但 street
为空,Dropwizard 会自动生成响应并将其发送到客户端(我不喜欢)。
我如何干预此响应,以便最终它也由映射器处理?
Dropwizard 注册了自己的约束违反异常映射器,您可以覆盖它。
由于 Jersey 尚不支持异常映射器 (https://java.net/jira/browse/JERSEY-2437) 上的 @Priority
注释,您应该在注册自己的映射器之前禁用 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));