我创建了两个ExceptionMappers:
GenericExceptionMapper implements ExceptionMapper<Throwable>
和
ValidationExceptionMapper implements ExceptionMapper<javax.validation.ValidationException>
GenericExceptionMapper检查Exception是否属于特定类型,如果是,则将完成某些映射。在所有其他情况下,它将映射到500。
ValdiationExceptionMapper将映射到具有特定响应的400。
现在我正在观察几件奇怪的事情。如果省略ValidationExceptionMapper,则不会调用GenericExceptionMapper。此外,如果我切断数据库连接,将触发非ExceptionMappers。在这两种情况下,响应都是500 html格式。我真正想要的是映射器应该捕获每个异常。
我正在使用Dropwizard 1.0.5并设置registerDefaultExceptionMappers: false
。
答案 0 :(得分:0)
首先,我认为为资源设置@Singleton并不是一个好主意。
另一方面: 这是通过实现 ExtendedExceptionMapper :
来定制针对特定异常的响应的正确方法:environment.jersey().register(new ExtendedExceptionMapper<WebApplicationException>() {
@Override
public Response toResponse(WebApplicationException exception) {
return Response.status(Response.Status.NOT_FOUND).build();
}
@Override
public boolean isMappable(WebApplicationException e) {
return Throwables.getRootCause(e).getClass() == MustacheNotFoundException.class;
}});