首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Websphere Java中的Java依赖注入

Websphere Java中的Java依赖注入
EN

Stack Overflow用户
提问于 2016-08-24 06:39:01
回答 3查看 2.4K关注 0票数 2

我试图在我非常简单的web应用程序中使用CDI,该应用程序运行在通过Docker安装的Websphere that中。

但是,除非我在注入的bean上指定范围注释(例如@ApplicationScoped),否则注入失败,尽管根据许多在线教程(例如),Java规范不需要这样做。

下面是失败的代码:

HelloWorldServlet.java

代码语言:javascript
复制
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();
    }

}

HelloService.java

代码语言:javascript
复制
package my.simple.app;

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

server.xml (Docker是websphere- image :javaee7 7)

代码语言:javascript
复制
<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>

但是我得到了这个错误

代码语言:javascript
复制
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中启用显式发现模式

链接:

  • 包装考虑
  • 启用Websphere feature中的CDI功能
  • 关于隐式和显式bean发现
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-24 14:21:25

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

这篇文章提供了一些有用的背景,并举例说明了这一点:

代码语言:javascript
复制
<?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 ->生成clicking部署描述符Stub,并确保从下拉"Bean发现模式“选择中选择all

缺点是性能受到影响,因为应用程序需要更长时间才能启动,但这是避免重新编译的一种折衷方法。

票数 5
EN

Stack Overflow用户

发布于 2016-09-22 21:21:19

虽然Scott的建议解决了您的问题,但下面是它的工作原理的全貌。

在CDI 1.2中,默认情况下所有应用程序都启用了CDI。

如果有一个空的beans.xml或带有bean发现模式=“all”的beans.xml,那么所有类都被选择为bean。

如果没有带bean发现模式的beans.xml或beans.xml =“注释”,则将扫描每个类以查找bean。只有使用bean定义注释(注解)注释的类才被视为bean。

在第一个示例中,由于您没有beans.xml,所以执行了对bean定义注释的扫描。由于没有找到bean定义注释,因此禁用了cdi。结果,注射失败了。

要启用注入,有两个解决方案: 1.用bean定义注释对类HelloService进行注释(例如,任何作用域: ApplicationScoped、RequestScoped、SessionScoped、ConversationScoped、依赖等)。这将使HelloService成为CDI,然后注入将成功。2.在WEB下为beans.xml文件添加一个空的beans.xml或.war文件,或者为.jar文件添加元-INF。

有关bean归档的更多信息,请参阅归档

票数 3
EN

Stack Overflow用户

发布于 2016-08-24 06:48:27

我对EJB还不太熟悉,但是您可以尝试在服务类中添加@无状态或@Service注释

代码语言:javascript
复制
package my.simple.app;
@Stateless
//@Service
public class HelloService {
    String createHelloMessage(String name) {
        return "Hello " + name + "!";
    }
}

编辑:,或者如果您不能像前面提到的那样修改HelloService,可以使用Producer方法http://docs.oracle.com/javaee/6/tutorial/doc/gjdid.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39116073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档