WELD-001408: Unsatisfied dependencies for type Customer with qualifiers @Default

JsfJakarta EeDependency InjectionCdiManaged Bean

Jsf Problem Overview


I'm a Java EE-newbie. I want to test JSF and therefore made a simple program but can not deploy it. I get the following error message:

cannot Deploy onlineshop-war
deploy is failing=Error occurred during deployment: Exception while loading the app : CDI deployment failure:WELD-001408: Unsatisfied dependencies for type Customer with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private de.java2enterprise.onlineshop.RegisterController.customer
at de.java2enterprise.onlineshop.RegisterController.customer(RegisterController.java:0)
. Please see server.log for more details.

My code is as follows: Customer.java:

package de.java2enterprise.onlineshop.model;
 
public class Customer {
    private String email;
    private String password;
}

registerController.java:

package de.java2enterprise.onlineshop;
 
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.inject.Inject;
import de.java2enterprise.onlineshop.model.*;

@Named
@RequestScoped
public class RegisterController {

    private static final long serialVersionUID = 1L;

    @Inject
    private Customer customer;

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    public String persist() {
        return "/index.xhtml";
    }
}

For compiling it I had to include cdi-api.jar as an external library. Anyone here who could help me? Thank you all in advance.

Jsf Solutions


Solution 1 - Jsf

Your Customer class has to be discovered by CDI as a bean. For that you have two options:

  1. Put a bean defining annotation on it. As @Model is a stereotype it's why it does the trick. A qualifier like @Named is not a bean defining annotation, reason why it doesn't work

  2. Change the bean discovery mode in your bean archive from the default "annotated" to "all" by adding a beans.xml file in your jar.

Keep in mind that @Named has only one usage : expose your bean to the UI. Other usages are for bad practice or compatibility with legacy framework.

Solution 2 - Jsf

it's also a good thing to make sure you have the right import

I had an issue like that and I found out that the bean was using

    javax.faces.view.ViewScoped;
                 ^

instead of

    javax.faces.bean.ViewScoped;
                 ^

Solution 3 - Jsf

I had the same problem but it had nothing to do with annotations. The problem happened while indexing beans in my container (Jboss EAP 6.3). One of my beans could not be indexed because it used Java 8 features an I got this sneaky little warning while deploying:

> WARN [org.jboss.as.server.deployment] ... Could not index class ... java.lang.IllegalStateException: Unknown tag! pos=20 poolCount = 133

Then at the injection point I got the error:

> Unsatisfied dependencies for type ... with qualifiers @Default

The solution is to update the Java annotations index. download new version of jandex (jandex-1.2.3.Final or newer) then put it into

> JBOSS_HOME\modules\system\layers\base\org\jboss\jandex\main and then update reference to the new file in module.xml

NOTE: EAP 6.4.x already have this fixed

Solution 4 - Jsf

Similar problem here, for me the issue was that the bean class had no default constructor, so the framework was not able to instantiate it.

Make sure that your beans always have a constructor with the default (no-args) signature

Solution 5 - Jsf

You need to annotate your Customer class with @Named or @Model annotation:

package de.java2enterprise.onlineshop.model;
@Model
public class Customer {
    private String email;
    private String password;
}

or create/modify beans.xml:

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

Solution 6 - Jsf

When you change your project from "war" to "jar", like another friend said on Jboss Forum:

enter image description here

Solution 7 - Jsf

To inject an Object, its class must be known to the CDI mechanism. Usualy adding the @Named annotation will do the trick.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionmike128View Question on Stackoverflow
Solution 1 - JsfAntoine Sabot-DurandView Answer on Stackoverflow
Solution 2 - JsfSirmyselfView Answer on Stackoverflow
Solution 3 - JsfMr.QView Answer on Stackoverflow
Solution 4 - JsfZ3d4sView Answer on Stackoverflow
Solution 5 - JsfSergey VinichenkoView Answer on Stackoverflow
Solution 6 - JsfMatheus SantzView Answer on Stackoverflow
Solution 7 - JsfHeiner WestphalView Answer on Stackoverflow