java - ExceptionMapper (Java EE 6) 可以处理 NON RuntimeException 吗?

标签 java jakarta-ee openejb

我想知道是否可以让 ExceptionMapper 处理 Exception 的子类,而不仅仅是 RuntimeException 的子类?

以下面的代码为例。如果ExampleException扩展了RuntimeException,则测试通过且没有错误。但是,如果 ExampleException 扩展了 Exception,则测试将引发错误。请参阅下面的错误输出。

以下是四个类:

  1. 示例异常
  2. 异常映射器示例
  3. 示例休息
  4. RestTest 示例

这是代码:

public class ExampleException extends Exception {
    public ExampleException(String message) {
    super(message);
    }
}

@Provider
public class ExampleExceptionMapper implements ExceptionMapper<ExampleException> {
    @Override
    public Response toResponse(ExampleException ex) {
        return Response.ok("Exception!").build();
    }
}

@Path("/example")
public class ExampleRest {

    @GET
    @Path(value = "/throw")
    public String throwException() throws ExampleException {
        throw new ExampleException("exception");
    }
}

@EnableServices(value = "jaxrs")
@RunWith(ApplicationComposer.class)
public class ExampleRestTest {

    @Module
    public EjbModule module() {
        EjbJar ejbJar = new EjbJar("beans");
        ejbJar.addEnterpriseBean(new SingletonBean(ExampleRest.class));

        final OpenejbJar openejbJar = new OpenejbJar();
        openejbJar.addEjbDeployment(new EjbDeployment(ejbJar.getEnterpriseBeans()[0]));

        final Properties properties = openejbJar.getEjbDeployment().iterator().next().getProperties();
        properties.setProperty("cxf.jaxrs.providers", ExampleExceptionMapper.class.getName());

        final EjbModule module = new EjbModule(ejbJar);
        module.setOpenejbJar(openejbJar);

        return module;
   }

    @Test
    public void testThrowException() {
        try {
            assertEquals("Exception!", IO.slurp(new URL("http://localhost:4204/ExampleRestTest/example/throw/")));
        } catch (Exception e) {
            e.printStackTrace();
            fail();
        }
    }
}

错误堆栈跟踪:

org.apache.cxf.interceptor.Fault: example.ExampleException: exception: exception while invoking public java.lang.String example.ExampleRest.throwException() throws example.ExampleException with params [].
at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:166)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:140)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:167)
at org.apache.openejb.server.cxf.rs.OpenEJBEJBInvoker.invoke(OpenEJBEJBInvoker.java:47)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:94)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:236)
at org.apache.openejb.server.cxf.rs.CxfRsHttpListener.onMessage(CxfRsHttpListener.java:79)
at org.apache.openejb.server.httpd.OpenEJBHttpRegistry$ClassLoaderHttpListener.onMessage(OpenEJBHttpRegistry.java:99)
at org.apache.openejb.server.httpd.HttpListenerRegistry.onMessage(HttpListenerRegistry.java:69)
at org.apache.openejb.server.httpd.OpenEJBHttpServer.process(OpenEJBHttpServer.java:246)
at org.apache.openejb.server.httpd.OpenEJBHttpServer.processRequest(OpenEJBHttpServer.java:188)
at org.apache.openejb.server.httpd.OpenEJBHttpServer.service(OpenEJBHttpServer.java:103)
at org.apache.openejb.server.httpd.HttpEjbServer.service(HttpEjbServer.java:63)
at org.apache.openejb.server.ServerServiceFilter.service(ServerServiceFilter.java:64)
at org.apache.openejb.server.ServerServiceFilter.service(ServerServiceFilter.java:64)
at org.apache.openejb.server.ServiceStats.service(ServiceStats.java:54)
at org.apache.openejb.server.ServerServiceFilter.service(ServerServiceFilter.java:64)
at org.apache.openejb.server.ServiceLogger.service(ServiceLogger.java:92)
at org.apache.openejb.server.ServerServiceFilter.service(ServerServiceFilter.java:64)
at org.apache.openejb.server.ServicePool.access$201(ServicePool.java:35)
at org.apache.openejb.server.ServicePool$3.run(ServicePool.java:174)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)

最佳答案

固定在行李箱上 ( https://issues.apache.org/jira/browse/TOMEE-918 )

您可以使用 ExceptionMapper 和 ex.getCause() 解决它

关于java - ExceptionMapper (Java EE 6) 可以处理 NON RuntimeException 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16255250/

相关文章:

java - JSF2.0 - 在对话框的 onShow 事件期间无法通过 Jquery 检索对话框内的 InputTextArea

java - EJB3 无状态 session Bean 是否允许继承?

java - 可嵌入 PK 对象在持久和刷新后未填充

java - 无状态 session Bean 与无状态单例

java - 如何更改 TomEE/OpenEJB 中的 EJB 计时器线程池大小?

java - 使用java套接字传输大量数据

java - 如何修复错误: cannot find symbol in android studio SQLite database

java - ArrayList 到字符串数组

java - 如果字符串较短,JSP substring() 不会显示任何内容

java - 部署在 JBOSS 上的 EJB 端点