我有一个针对特定业务异常的自定义Mapper,如下所示:
@Provider
@Singleton
public class MissingHeaderExceptionMapper implements ExceptionMapper<MissingHeaderException> {
@Override
public Response toResponse(MissingHeaderException ex) {
抛出异常时不会调用它。
我在TomEE上发现了很多关于这个问题的在线讨论。提供的很多答案显然都是针对专家的,因为我真的不明白他们在谈论什么。
我试图像这个页面建议的那样向项目中添加一个Application对象
我也关注了此页面中的示例: https://javaspecialist.wordpress.com/2013/09/08/rest-api-exception-handling-using-jax-rs-in-jee-6/
在线有大量的ExceptionMapper示例代码,但是为什么它们都不适用于TomEE。我错过了什么?
修改
我在web.xml中添加了以下配置
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>namespace.MissingHeaderExceptionMapper</param-value>
</context-param>
提供简单的服务
@GET
@Path("/test")
public void test() {
throw new MissingHeaderException("test");
}
当我尝试调用此端点时,我点击了这一行,以及我的MissingHeaderException的构造函数,但它从未点击过Mapper的构造函数。代码只是继续,我得到了这个
WebApplicationException has been caught, status: 500
在调试器控制台中,我正在
14-Dec-2015 21:46:13.804警告[http-bio-8080-exec-2] org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper.toResponse namespace.MissingHeaderException 在namespace.myService.test
但我的Mapper实际上正在格式化一个很好的错误响应,如下所示:
@Provider
public final class MissingHeaderExceptionMapper implements ExceptionMapper<MissingHeaderException> {
public MissingHeaderExceptionMapper() {
}
@Override
public Response toResponse(MissingHeaderException ex) {
ErrorPayload errorPayload = new ErrorPayload();
errorPayload.setCode("8001008");
errorPayload.setMessage("Header " + ex.getHeaderName() + " is missing");
return Response.status(Response.Status.PRECONDITION_FAILED).
entity(errorPayload).
type(MediaType.APPLICATION_XML_TYPE).
build();
}
}
我没想到只有一行文字,即使是,状态代码也不对......
有些事情是错的,但我现在很困惑。 Java生态系统真的无意让它更容易理解...... :(