1

我是 CDI 的新手。这是我的第一个示例,我正在尝试运行它。搜索了互联网后,我编写了以下代码:我要注入的类

public class Temp {

public Temp(){

}

public String getMe(){
    return "something";
}
}

小服务程序

@WebServlet(name = "NewServlet", urlPatterns = {"/NewServlet"})
public class NewServlet extends HttpServlet {

@Inject
public Temp temp;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        out.println("<body>");
        out.println("<h1> Here it is"+temp.getMe()+ "</h1>");
        out.println("</body>");
    }
}
...

但我必须在 glassfish 4 中出现以下错误:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 在注入点 [[BackedAnnotatedField] @Inject private xxx.example.NewServlet.temp] 带有限定符 [@Default] 的类型 [Temp] 的依赖关系不满足

我究竟做错了什么?

4

2 回答 2

11

内部不beans.xml存在WEB-INF或文件需要更改bean-discovery-mode="annotated"bean-discovery-mode="all".


<?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>

解释

推荐值“ annotated”只识别带注释的CDI托管 bean。没有任何注释的 Bean 将被忽略。由于您的Temp课程不是CDIbean,因此建议不适用于您的情况。

使用 bean-discovery-mode="annotated"

要使用annotated,请使用 @RequestScoped 注释类:

// Import only this RequestScoped
import javax.enterprise.context.RequestScoped;

@RequestScoped
public class Temp {

    public Temp() { }

    public String getMe() {
        return "something";
    }
}

RequestScoped会将您的Temp类转换为CDIbean 并将与 bean-discovery-mode="annotated".

于 2013-11-11T06:25:50.853 回答
3

在我使用这个命令:

asadmin set configs.config.server-config.cdi-service.enable-implicit-cdi=false

所以禁用对我有用的 enable-implicit-cdi。

于 2014-08-27T10:31:25.027 回答