我尝试做以下(很多细节,对不起......):在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应用:
但实际上,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
任何想法如何解决这个问题?
谢谢! 我正在使用应用程序解决方案。令我感到困扰的是缺少文档以及servlet和jax-rs规范之间的耦合(太)松散。 想知道是否有人可以解释这... – Aviram
随机奇怪的事实:在封面,JAX-RS是一个servlet,它只是内置到服务器:) –
并谈到文档,使用甲骨文官方指南Java EE或使用TomEE的示例页面!他们总是向你展示“正确”的做事方式。你的例子就是你需要为Vanilla Tomcat做的事情 –