JAX-RS on EJB 3.1 Session Bean which only has Remote Interface
是否可以在仅具有远程接口的EJB 3.1会话bean上使用@Path之类的JAX-RS注释?
这有效:
1 2 3 4 5 6 7 8 9 | @Path("/service") @Stateless public class ServiceOne { @POST @Path("/foo") public Response foo() { return Response.ok().build(); } } |
但是,如果我添加了远程接口...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Remote public interface ServiceOneRemote { Response foo(); } @Path("/service") @Stateless public class ServiceOne implements ServiceOneRemote { @POST @Path("/foo") public Response foo() { return Response.ok().build(); } } |
...我收到NotSerializableException
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | java.io.NotSerializableException: org.jboss.resteasy.core.ServerResponse org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:253) org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:128) org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:295) org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:286) org.jboss.as.ejb3.remote.LocalEjbReceiver.processInvocation(LocalEjbReceiver.java:258) org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:184) org.jboss.ejb.client.EJBObjectInterceptor.handleInvocation(EJBObjectInterceptor.java:58) org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186) org.jboss.ejb.client.EJBHomeInterceptor.handleInvocation(EJBHomeInterceptor.java:83) org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186) org.jboss.ejb.client.TransactionInterceptor.handleInvocation(TransactionInterceptor.java:42) org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186) org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:125) org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186) org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255) org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200) org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183) org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146) com.sun.proxy.$Proxy88.foo(Unknown Source) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:483) org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:168) org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:269) org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:227) org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:216) org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:541) org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:523) org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:125) org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) javax.servlet.http.HttpServlet.service(HttpServlet.java:847) |
从诸如使用本地接口实现EJB的RESTful视图的文章中,我得到的印象是JAX-RS仅适用于具有本地接口的会话bean。但是我找不到任何明确指出不可能的资源。
我做错什么了吗?还是这不可能?
顺便说一句:我正在运行JBoss EAP 6.4应用服务器。
不可能。在JSR-339(用于RESTful Web服务的JavaTM API)规范中,该声明如下:
JAX-RS annotations can be applied to methods in an EJB’s local
interface or directly to methods in a no-interface EJB.