如果@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}}
答案 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