【问题标题】:find path to JAX-RS resource找到 JAX-RS 资源的路径
【发布时间】:2024-01-21 07:48:01
【问题描述】:

我只是找不到访问部署到 Wildfly 的 JAX-RS 资源的路径。

ear.ear pom:

<parent>
    <artifactId>jee-services</artifactId>
    <groupId>org.mycompany</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<packaging>ear</packaging>
<modelVersion>4.0.0</modelVersion>
<artifactId>ear</artifactId>
<dependencies>
    <dependency>
        <groupId>org.mycompany</groupId>
        <artifactId>ejb_book</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>ejb</type>
    </dependency>
</dependencies>

ejb_book pom:

<parent>
    <artifactId>jee-services</artifactId>
    <groupId>org.mycompany</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>ejb</packaging>
<artifactId>ejb_book</artifactId>

应用程序配置

@ApplicationPath("/resources")
public class ApplicationConfig extends Application {
}

资源

@Stateless
@Path("/books")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class BookResource extends AbstractFacade<Book> {
    @PersistenceContext
    private EntityManager entityManager;

    @GET
    @Path("/getBooks")
    public Book getBook() {
        return new Book();
    }

我认为问题在于我将我的 ejb_book.jar 打包到 ear.ear(我收集所有其他 ejb 模块的地方)

我试过了:

localhost:8080/ear/resources/books/getBooks

还有许多其他组合,但没有一个有效。

应用程序可以很好地部署到 WildFly 服务器。

顺便说一句:有没有工具可以帮助人们访问他们的 JAX-RS 资源?以 IDE 为例。所以我的问题不再是问题了。

【问题讨论】:

  • 您是否也在 EAR 中打包了一个 WAR?您需要提供上下文根才能访问您的 REST 服务。
  • 不,没有战争。我只是在浏览器中调用 url。我错过了什么吗?
  • 是的,你错过了。正如documentationJAX-RS 应用程序被打包为 .war 文件中的 Web 应用程序。”中所述。因此,您需要有一个 WAR 以便为您的应用程序的 REST 服务提供 context-root。只有这样,您才能以以下形式调用 REST 服务:localhost:8080/context-root/ear-1.0-SNAPSHOT/resources/books/…
  • 谢谢!所以我可以添加一个空的 WAR 并将其作为另一个模块添加到我的耳朵中吗?或者在部署这样的后端时,这里的最佳做法是什么?
  • 嗯,首先你应该(对你自己)证明需要一个 EAR 作为反对将所有东西打包到一个 WAR 中并将你的依赖项放在你的 WAR 的 WEB-INF/lib 中。因为,毕竟,您正在尝试提供 REST API。另一方面,如果您尝试提供比 REST 更多的 API,那么是的,您可以拥有一个包含两个模块的 EAR:WAR 和 EJB。

标签: maven jakarta-ee jax-rs ear


【解决方案1】:

根据 JAX-RS 2.0 规范,2.3.2 Servlet

部分

JAX-RS 应用程序被打包为 .war 文件中的 Web 应用程序。

由于您没有将应用程序打包为 WAR 模块,并且您的 EAR 中也没有 WAR 模块,因此您没有为(Web)应用程序提供上下文根。

这会阻止您通过所需的方式访问您的 REST API:

http://localhost:8080/<context-root>/resources/books/getBooks

作为一种解决方案,您可以将整个应用程序打包为 WAR,将应用程序类放在 WEB-INF/classes 或 WEB-INF/lib 中,并将所需的库放在 WEB-INF/lib 中,或者您可以保持使用你的 EAR,添加一个 WAR 模块。

【讨论】:

  • JavaEE 应用程序的最新项目结构是什么?可以说它唯一的后端并公开了一些剩余资源。就像我一样。为每个域(微服务)或一个 WAR 中的所有内容分隔 WAR?
  • 我不太确定我是否理解您的问题,但就documentation 而言,所有内容都将放在一个 WAR 中。现在,当您说 每个域的分隔 WAR 时,您的意思是您有多个 JAX-RS 应用程序,每个应用程序都将在一个 WAR 中?
  • 是的。我的意思是,如果涉及到大型应用程序,您必须以某种方式构建它们。然后创建一个负责该域中所有业务逻辑的 user.war。然后是 product.war 等等。或者关注点分离的方法是什么?
  • 如果你是这个意思,我认为不应该为每个功能创建一个 WAR。您将为您的 Web 应用程序创建一个 WAR,然后您可以拥有一个 JAR,例如,每个服务。然后,在您的 WAR 的 web.xml 文件中,您必须按照提到的 here 定义每个 JAX-RS 服务。然后,由开发人员根据他/她的需求来定义架构。