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