无法到达作为REST服务公开的EJB

时间:2014-11-16 07:55:11

标签: ejb jax-rs ejb-3.1 wildfly wildfly-8

我正在尝试使用JAX-RS注释将一些EJB公开为REST Web服务。当我在war中将包含EJB Jar的WEB-INF/lib文件部署到Wildfly 8时,我可以在Web管理面板EJB Jar中看到已部署,但是我无法访问REST端点并获得404。

这是web.xml

的内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/separated/*</url-pattern>
    </servlet-mapping>
</web-app>

这是一个示例会话bean我正在尝试作为Web服务并放入jar文件:

@Stateless(name = "TestSessionEJB")
@LocalBean
public class TestSessionBean {

    @PersistenceContext(unitName = "TestPU")
    private EntityManager em;

    public AuthenticationSessionBean() {
    }

    @GET
    @Path("ep")
    public String testEP() {
        return "Hello from testEP()";
    }
}

我无法通过testEP到达/<war_file_name>/separated/ep。向ejb-jar.xml添加了WEB-INF/描述符,仍然没有成功。我使用在war文件的WEB-INF/classes

中直接编译和部署的类创建了另一项服务
@ApplicationPath("/integrated")
public class TestRestApp extends Application {
}

@Path("/ep")
public class TestRestEp {

    @GET
    public String doGet() {
        return "success";
    }
}

我可以通过doGet()到达/<war_file_name>/integrated/ep

我错过了什么吗?我可以将EJB部署为单独的jar文件,并将它们公开为没有包装器的REST Web服务吗?

更新 我使用TestSessionBeanApplicationPath("separated")进行了注释,并使其从javax.ws.rs.Application延伸。仍然有404但这一次它是不同的; 404没有“未找到”的身体。如果我使端点路径与TestRestApp中的端点相同,例如@Path("ep")它映射到TestRestApp中的端点,我通过导航获得“成功”而不是“来自testEP()的Hello”到/<war_file_name>/separated/ep。如果我在TestSessionBean中使用未在TestRestApp中定义的路径注释方法,则结果为404.我从servlet定义中清除了web.xml,但结果仍然相同。

1 个答案:

答案 0 :(得分:5)

第一

使用JAX-RS注释简单地注释EJB类的方法不会使该方法成为JAX-RS资源方法。您需要使用TestSessionBean@Path进行注释,使TestRestEp成为根资源类,就像使用javax.ws.rs.Application一样。或者,您可以将此类设置为子资源,并让Root资源将请求传递给此类。如果你不知道后者意味着什么,我就会坚持前者。

第二

记住Wildfly(JBoss)模块化基础设施

Resteasy(Wildfly&#39; JAX-RS实施)参考指南:

  

Resteasy和JAX-RS会自动加载到您的部署类路径中,当且仅当您部署JAX-RS应用程序时

话虽这么说,你的web.xml并没有创建一个JAX-RS应用程序。您基本上依赖于(默认的JAX-RS指定)Application servlet,只有在JAX-RS模块加载到服务器中时才会加载。

如果你有@ApplicationPath子类,并带有Application注释,则会创建一个JAX-RS应用程序,并将JAX-RS模块加载到服务器中,并且将扫描类路径以查找资源类

在JAX-RS规范中也有说明:

  

构成JAX-RS应用程序的资源和提供程序是通过应用程序提供的Application子类配置的。实现可以提供用于定位资源类和提供者的替代机制(例如,运行时类扫描),但使用Application是唯一可移植的配置方法。

所以我会坚持{{1}}子类。不需要web.xml