gpt4 book ai didi

cdi - Websphere Liberty 配置文件中的 Java EE 依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-03 13:40:29 28 4
gpt4 key购买 nike

我正在尝试在我非常简单的 Web 应用程序中使用 CDI,该应用程序在通过 Docker 安装的 Websphere Liberty 配置文件中运行。

然而,注入(inject)失败,除非我在注入(inject)的 bean 上指定范围注释(例如 @ApplicationScoped),尽管根据很多在线教程(例如 this),Java EE 规范没有需要这个。

下面是失败的代码:

HelloWorldServlet.java

package my.simple.app;

import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/HelloWorld")
public class HelloWorldServlet extends HttpServlet {

static String PAGE_HEADER = "<html><head /><body>";
static String PAGE_FOOTER = "</body></html>";

@Inject
HelloService helloService;

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println(PAGE_HEADER);
writer.println("<h1>" + helloService.createHelloMessage("World") + "</h1>");
writer.println(PAGE_FOOTER);
writer.close();
}

}

你好服务.java

package my.simple.app;

public class HelloService {
String createHelloMessage(String name) {
return "Hello " + name + "!";
}
}

server.xml(Docker镜像为websphere-liberty:javaee7)

<server description="default servlet engine">

<httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" httpsPort="9443" />

<!-- Enable features -->
<featureManager>
<feature>servlet-3.1</feature>
<feature>cdi-1.2</feature>
</featureManager>

</server>

但是我得到这个错误

Error 404: javax.servlet.UnavailableException: SRVE0319E: For the [my.simple.app.HelloWorldServlet] servlet, my.simple.app.HelloWorldServlet servlet class was found, but a resource injection failure has occurred. The @Inject java.lang.reflect.Field.helloService reference of type my.simple.app.HelloService for the null component in the app.war module of the app application cannot be resolved.

然而,一旦我将 @ApplicationScoped 添加到 HelloService 中,它就会开始工作。

我做错了什么?

解决方案:

在 CDI1.2(我正在使用的)中,默认情况下只发现带注释的 bean。要让所有的bean都被发现,需要在beans.xml

中启用显式发现模式

链接:

最佳答案

您可以通过将 bean 发现模式更改为 all 来强制 CDI 将 servlet 视为 bean 并执行注入(inject)。 .

This article提供了一些有用的背景和示例:

<?xml version="1.0" encoding="UTF-8"?>
<beans 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/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>

或者,在 WDT 中,您可以通过右键单击项目并选择 Java EE 工具 -> 生成 CDI Beans 部署描述符 stub 来生成它,并确保选择 all从下拉“Bean 发现模式”中选择。

缺点是性能会受到影响,因为应用程序需要更长的时间才能启动,但这是您可以避免重新编译的权衡。

关于cdi - Websphere Liberty 配置文件中的 Java EE 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39116073/

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