Подтвердить что ты не робот

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 в качестве внешней библиотеки. Кто-нибудь здесь, кто мог бы мне помочь? Спасибо всем заранее.

4b9b3361

Ответ 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 будет делать трюк.