我试图做以下事情(很多细节,对不起......):
使用@EJB
的jax-rs服务以避免jndi查找。像
@Path("rest/my-path)
public class Service {
@EJB
private MyEJB me;
@Path("foo")
@GET
public String foo() {
return me.foo();
}
}
使用CXFNonSpringJaxrsServlet
并限制url-pattern
。 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-mapping和jaxrs解析器的组合使
http://localhost:8080/my-app/rest/my-path/foo返回 404
和(注意双/休息/休息/)
http://localhost:8080/my-app/rest/rest/my-path/foo实际调用该方法,但 MyEJB 为空
没有找到servlet-mapping和服务路径的任意组合,而jaxrs.address
使得根url返回index.html并且正确的服务url正在调用foo而MyEJB不为null
任何想法如何解决这个问题?
答案 0 :(得分: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));
}
}