我如何处理@Produces异常

时间:2014-04-29 12:11:04

标签: java java-ee cdi

如果@Inject引发未经检查的@Produces MyRuntimeException延长RuntimeException

,我的@Provider public class DefaultExceptionMapper implements ExceptionMapper<RuntimeException> { @Override public Response toResponse(RuntimeException ex) { return Response.serverError().entity(message).type(MediaType.APPLICATION_JSON).build(); } } 可能会失败

我有一个我正在尝试使用的默认异常处理程序:

DefaultExceptionMapper

ApplicationConfig已在@Inject中注册。

但是,当@Produces MyRuntimeException抛出[ERROR ] CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "getMyBean" on bean "BeanId(my-app.war#MyProcuderFactory, null)". Exception data: com.mycompany.ex.MyRuntimeException: at com.mycompany.MyProcuderFactory.getMyBean(MyProcuderFactory.java:74) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.ibm.ejs.container.EJSContainer.invokeProceed(EJSContainer.java:5772) at [internal classes] 时,不会调用它。 我的REST接口返回了一个不那么好的错误响应。

{{1}}

2 个答案:

答案 0 :(得分:0)

我的建议适用于实现Java EE6规范的应用程序服务器。尝试注册JSON Mapper提供程序时遇到了类似的问题。因此,我将ApplicationConfig替换为空的,这对我有用:

@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {
}

我也很欣赏您的Response构建,它显然遵循最佳实践。但请在下面找到另一个可能对调试有用的响应构建:

Response.status(Response.Status.INTERNAL_SERVER_ERROR).header("x-exception-detail", ex.getLocalizedMessage()).build();

答案 1 :(得分:0)

如果RuntimeException没有@ApplicationException批注,则抛出CNTR0020E。 因此,您可能将RuntimException更改为某些已检查的Exception或注释RuntimeException