2016-08-16 61 views
0

我尝试做以下(很多细节,对不起......):在JAX-RS(CXF)服务使用EJB和TomEE 7.0.1

有一个一个JAX-RS服务@EJB以避免jndi查找。使用CXFNonSpringJaxrsServlet并限制url-pattern

@Path("rest/my-path) 
public class Service { 

    @EJB 
    private MyEJB me; 

    @Path("foo") 
    @GET 
    public String foo() { 
    return me.foo(); 
    } 
} 

东西。 web.xml中应该是这样的:

<servlet> 
    <servlet-name>my-servlet</servlet-name> 
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class> 
    <init-param> 
     <param-name>jaxrs.serviceClasses</param-name> 
     <param-value> 
      com.example.Service 
     </param-value> 
    </init-param> 
</servlet> 

<servlet-mapping> 
    <servlet-name>my-servlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

所以理论上http://localhost:8080/my-app/rest/my-path/foo会叫,你猜对了,foo()

TomEE的日志支持这一点:

设置服务器的发布地址为/ REST应用:

http://localhost:8080/my-app/

URI:http://localhost:8080/my-app/rest/my-path

GET http://localhost:8080/my-app/rest/my-path/foo

但实际上,Servlet映射的组合和JAXRS解析器使得

http://localhost:8080/my-app/rest/my-path/foo回报

和(注意双/休息/休息/)

http://localhost:8080/my-app/rest/rest/my-path/foo实际调用的方法,但MyEJB是空

没有找到,使根URL返回的index.html和正确的服务URL是调用foo和MyEJB Servlet映射和服务路径和jaxrs.address的任意组合是不是null

任何想法如何解决这个问题?

回答

2

web.xml删除此:

<servlet> 
    <servlet-name>my-servlet</servlet-name> 
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class> 
    <init-param> 
     <param-name>jaxrs.serviceClasses</param-name> 
     <param-value> 
      com.example.Service 
     </param-value> 
    </init-param> 
</servlet> 

<servlet-mapping> 
    <servlet-name>my-servlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

TomEE自动扫描您的应用程序,并添加任何REST控制器。在启动过程中,日志将包含您的REST URL的路径。您可能需要添加一个像这样的Application.class

@ApplicationPath("/rest-prefix") 
public class ApplicationConfig extends Application { 
    public Set<Class<?>> getClasses() { 
     return new HashSet<Class<?>>(Arrays.asList(Service.class)); 
    } 
} 
+0

谢谢! 我正在使用应用程序解决方案。令我感到困扰的是缺少文档以及servlet和jax-rs规范之间的耦合(太)松散。 想知道是否有人可以解释这... – Aviram

+0

随机奇怪的事实:在封面,JAX-RS是一个servlet,它只是内置到服务器:) –

+0

并谈到文档,使用甲骨文官方指南Java EE或使用TomEE的示例页面!他们总是向你展示“正确”的做事方式。你的例子就是你需要为Vanilla Tomcat做的事情 –