在JAX-RS(CXF)服务和TomEE 7.0.1中使用EJB

时间:2016-08-16 17:10:49

标签: jax-rs cxf openejb tomee-7

我试图做以下事情(很多细节,对不起......):

使用@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应用程序:

     

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

     

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

     

获取http://localhost:8080/my-app/rest/my-path/foo

但实际上,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

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

1 个答案:

答案 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));
    }
}