java - 如何更改 Dropwizard 的验证错误行为?

标签 java bean-validation jersey-2.0 dropwizard validationerror

在 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 会自动生成响应并将其发送到客户端(我不喜欢这样做)。

如何干扰此响应,以便最终它也由映射器处理?

最佳答案

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) {
    ...
    }
}

关于java - 如何更改 Dropwizard 的验证错误行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29492359/

相关文章:

java - 通过反射检索参数值

jsf-2 - 在 JSF 中带注释的验证器生成的错误消息中包含字段名称

rest - org.glassfish.hk2.api.UnsatisfiedDependencyException : There was no object available for injection at SystemInjecteeImpl 问题

java - Sqlite 列到字符串数组

java - 如何在 XSL 函数 'document()' (xalan-j) 中禁用 DTD 验证

Java 8 流 - 计算器异常

jax-rs - MessageBodyWriter 未找到 从 fatjar 运行时出错

java - Spring JAVAX 验证年份大于或等于当前年份

java - 如何以干净的方式在spring-boot中验证基于另一个属性?

java - Jersey 子资源将我的 API 包装在额外的 JSON 层中 - 为什么我需要这个?