gpt4 book ai didi

ejb - 无法访问作为 REST 服务公开的 EJB

转载 作者:行者123 更新时间:2023-12-01 15:19:50 26 4
gpt4 key购买 nike

我正在尝试使用 JAX-RS 注释将一些 EJB 公开为 REST Web 服务。当我部署 war WEB-INF/lib 中包含 EJB Jar 的文件到 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>

这是一个示例 session 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 中的端点通过导航到 /<war_file_name>/separated/ep,我获得了“成功”而不是“来自 testEP() 的你好” .如果我在 TestSessionBean 中注释一个方法使用未在 TestRestApp 中定义的路径结果是 404。我清除了我的 web.xml在 servlet 定义之外,结果仍然相同。

最佳答案

首先

简单地使用 JAX-RS 注释对 EJB 类的方法进行注释不会使该方法成为 JAX-RS 资源方法。您需要使用 @Path 对其进行注释,从而使 TestSessionBean 成为根资源类,就像您对 TestRestEp 所做的那样。或者您可以使此类成为子资源,并让根资源将请求传递给此类。如果您不知道后者的含义,我只会坚持使用前者。

第二

牢记 Wildfly (JBoss) 模块化架构

Resteasy(Wildfly 的 JAX-RS 实现)引用指南中说:

Resteasy and JAX-RS are automically loaded into your deployment's classpath, if and only if you are deploying a JAX-RS Application.

也就是说,您的 web.xml 不会创建 JAX-RS 应用程序。您基本上依赖于(指定的默认 JAX-RS)javax.ws.rs.Application servlet,它仅在 JAX-RS 模块加载到服务器时加载。

当您有一个 Application 子类时,带有 @ApplicationPath 注释,这将创建一个 JAX-RS 应用程序,并将 JAX-RS 模块加载到服务器和将扫描类路径以查找资源类。

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

The resources and providers that make up a JAX-RS application are configured via an application-supplied subclass of Application. An implementation MAY provide alternate mechanisms for locating resource classes and providers (e.g. runtime class scanning) but use of Application is the only portable means of configuration.

所以我会坚持使用 Application 子类。不需要 web.xml

关于ejb - 无法访问作为 REST 服务公开的 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26954985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com