WELD-001408: Невыполненные зависимости для типа Клиент с квалификаторами @Default
Я новичок Java EE. Я хочу проверить JSF и, следовательно, сделать простую программу, но не могу ее развернуть. Появляется следующее сообщение об ошибке:
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.
Мой код выглядит следующим образом:
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";
}
}
Для компиляции мне пришлось включить cdi-api.jar в качестве внешней библиотеки. Кто-нибудь здесь, кто мог бы мне помочь? Спасибо всем заранее.
Ответы
Ответ 1
Ваш класс Customer
должен быть обнаружен CDI как bean. Для этого у вас есть два варианта:
-
Поместите bean определение аннотации на нем. Поскольку @Model
является стереотипом, то почему он делает трюк. Определитель, такой как @Named
, не является определяющей аннотацией bean, причина, по которой он не работает.
-
Измените режим обнаружения bean в вашем bean архиве по умолчанию "аннотированный" на "все", добавив файл beans.xml
в вашей банке.
Имейте в виду, что @Named имеет только одно использование: выведите свой bean в пользовательский интерфейс. Другие способы использования - неправильная практика или совместимость с устаревшей инфраструктурой.
Ответ 2
это также хорошая вещь, чтобы убедиться, что у вас есть правильный импорт
У меня была такая проблема, и я узнал, что бин использует
javax.faces.view.ViewScoped;
^
вместо
javax.faces.bean.ViewScoped;
^
Одно слово может разрушить мир иногда... или просто разрушить мой день в этом случае.
Ответ 3
У меня была такая же проблема, но она не имела ничего общего с аннотациями. Проблема возникла при индексации bean-компонентов в моем контейнере (Jboss EAP 6.3). Один из моих bean-компонентов не может быть проиндексирован, потому что он использует функции Java 8, и я получил небольшое хитрое предупреждение при развертывании:
WARN [org.jboss.as.server.deployment]... Не удалось проиндексировать класс... java.lang.IllegalStateException: неизвестный тег! pos = 20 poolCount = 133
Тогда в точке впрыска я получил ошибку:
Неудовлетворенные зависимости для типа... с квалификаторами @Default
Решение заключается в обновлении индекса аннотаций Java. скачайте новую версию jandex (jandex-1.2.3.Final или новее), затем вставьте ее в
JBOSS_HOME\modules\system\layer\base\org\jboss\jandex\main, а затем обновите ссылку на новый файл в module.xml
ПРИМЕЧАНИЕ: EAP 6.4.x уже имеет это исправлено
Ответ 4
Вам необходимо аннотировать свой класс Customer с помощью аннотации @Named или @Model:
package de.java2enterprise.onlineshop.model;
@Model
public class Customer {
private String email;
private String password;
}
или создать/изменить 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>
Ответ 5
Чтобы ввести объект, его класс должен быть известен механизму CDI. Обычно добавление аннотации @Named будет делать трюк.