2

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

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

4

2 回答 2

4

Dropwizard 注册他们自己的约束违规异常映射器,您可以覆盖它。

由于 Jersey 尚不支持@Priority异常映射器上的注释 ( https://java.net/jira/browse/JERSEY-2437 ),因此您应该在注册自己的之前禁用 Dropwizard 映射器的注册。这是应用程序的 run 方法和异常映射器的片段:

@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) {
    ...
    }
}
于 2015-04-12T12:29:10.697 回答
4

在较新的 Dropwizard 版本(例如 0.9.2)中,我必须这样做:

env.jersey().register(new JsonProcessingExceptionMapper(true));

于 2016-03-16T17:24:08.647 回答