部署到 Jetty 11 的 WAR 文件中的 RESTEasy + Weld (CDI) 似乎不起作用

问题描述 投票:0回答:1

我正在尝试将 WAR 文件部署到 Jetty 11,其中包括使用 RESTEasy 编写的 REST 服务,该服务通过 Weld 使用 CDI(上下文和依赖注入),但它似乎不起作用。 该项目是使用 Maven 管理的,我使用 jetty-maven-plugin 来测试它(使用命令“mvn jetty:run”)。

详情:

  • RESTEasy 7.0.0.Alpha1(我必须使用7.0.0.Alpha1,早期版本使用与Weld冲突的Jandex 2.X.X)
  • 焊接 5.1.2.最终
  • Jetty 11.0.19(我使用GWT 2.11.0来实现客户端,需要支持JDK 11)
  • beans.xml 是空的并且位于 WEB-INF 中
  • 使用 Jakarta servlet 5.0,web.xml 非常小,仅指向扩展 RESTEasy Application 的类。

我使用的依赖项:

        <!-- RESTEasy -->
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-servlet-initializer</artifactId>
            <version>7.0.0.Alpha1</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson2-provider</artifactId>
            <version>7.0.0.Alpha1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-cdi -->
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-cdi</artifactId>
            <version>7.0.0.Alpha1</version>
        </dependency>

        <!-- Jakarta EE main APIs -->
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-api</artifactId>
            <version>10.0.0</version>
        </dependency>
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-web-api</artifactId>
            <version>10.0.0</version>
        </dependency>

        <!-- Web Push -->
        <dependency>
            <groupId>nl.martijndwars</groupId>
            <artifactId>web-push</artifactId>
            <version>5.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.55</version>
        </dependency>

        <!-- SQL based db connection pooling -->
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.12.0</version>
        </dependency>

        <!-- Weld CDI Support -->
        <dependency>
            <groupId>org.jboss.weld.servlet</groupId>
            <artifactId>weld-servlet-core</artifactId>
            <version>5.1.2.Final</version>
        </dependency>

Maven jetty 插件:

                <plugin>
                    <groupId>org.eclipse.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                    <version>11.0.19</version>
                </plugin>

运行“mvn jetty:run”时出现的错误:

INFO: WELD-000900: 5.1.2 (Final)
May 08, 2024 7:08:55 PM org.jboss.weld.environment.deployment.discovery.DiscoveryStrategyFactory create
INFO: WELD-ENV-000020: Using jandex for bean discovery
May 08, 2024 7:08:55 PM org.jboss.weld.bootstrap.WeldStartup startContainer
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
May 08, 2024 7:08:55 PM org.jboss.weld.environment.servlet.WeldServletLifecycle initialize
INFO: WELD-ENV-001001: No supported servlet container detected, CDI injection will NOT be available in Servlets, Filters or Listeners

当然,我所有用“@Inject”注释的字段都是空的。

为什么它没有检测到支持的 servlet 容器?!

编辑: web.xml 内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         metadata-complete="false"
         version="5.0">

    <!-- Servlets -->
    <servlet>
        <servlet-name>com.example.DemoApplication</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.example.DemoApplication</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <!-- Default page to serve -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

java rest maven jetty cdi
1个回答
0
投票

在您的

WEB-INF/web.xml
中,您需要一些东西。

第一个,设置CDI初始化模式。

<web-app ...>
  <context-param>
    <param-name>org.eclipse.jetty.cdi</param-name>
    <param-value>CdiDecoratingListener</param-value>
  </context-param>
</web-app>

然后在您的

cdi
 中启用 
${jetty.base}

模块
$ cd /path/to/myjettybase
$ java -jar /path/to/jetty-home/start.jar --add-module=cdi

如果这不起作用,您可能需要启用焊接代码库的增强初始化。

<web-app ...>
  <listener>
    <listener-class>org.jboss.weld.environment.servlet.EnhancedListener</listener-class>
  </listener>
</web-app>
© www.soinside.com 2019 - 2024. All rights reserved.