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