Java – Glassfish 4, simple example in CDI fails with WELD-001408 Unsatisfied dependencies

cdidependency-injectionglassfishjakarta-eejava

I am a very newbie in CDI. This is my FIRST example and I am trying to run it. Having searched the internet I wrote the following code:
Class that I want to be injected

public class Temp {

public Temp(){

}

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

Servlet

@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>");
    }
}
...

But I have to following error in glassfish 4:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied
dependencies for type [Temp] with qualifiers [@Default] at injection
point [[BackedAnnotatedField] @Inject private
xxx.example.NewServlet.temp]

What am I doing wrong?

Best Answer

Either no beans.xml exists within WEB-INF or the file requires changing bean-discovery-mode="annotated" to 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>

Explanation

The recommended value "annotated" only recognizes annotated CDI managed beans. Beans without any annotation are ignored. As your Temp class is not CDI bean, so recommendation is not applicable in your case.

Using bean-discovery-mode="annotated"

To work with annotated, annotate the class with @RequestScoped:

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

@RequestScoped
public class Temp {

    public Temp() { }

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

This RequestScoped will convert your Temp class to CDI bean and will be work with bean-discovery-mode="annotated".

Related Topic