【问题标题】:Using EJBs in a JAX-RS (CXF) service and TomEE 7.0.1在 JAX-RS (CXF) 服务和 TomEE 7.0.1 中使用 EJB
【发布时间】:2016-08-16 17:10:49
【问题描述】:

我正在尝试执行以下操作(很多细节,抱歉...):

有一个带有@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 Application:

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

and(注意双/rest/rest/)

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

没有找到任何 servlet-mapping 和服务路径和 jaxrs.address 的组合使根 url 返回 index.html 并且正确的服务 url 正在调用 foo 并且 MyEJB 不为空

有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: jax-rs cxf openejb tomee-7


    【解决方案1】:

    从您的 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));
        }
    }
    

    【讨论】:

    • 谢谢!我正在使用应用程序解决方案。令我烦恼的是缺少文档以及 servlet 和 jax-rs 规范之间的(太)松散耦合。想知道是否有人可以解释这个......
    • 随机奇怪的事实:在幕后,JAX-RS 是一个 servlet,它只是内置在服务器中:)
    • 说到文档,使用 Oracle 的 Java EE 官方指南或使用 TomEE 的示例页面!他们总是向您展示做事的“正确”方式。您的示例将是您需要为 Vanilla Tomcat 做的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多