WELD-001408:对带有限定符@Default 的类型 Customer 的依赖关系不满足

WELD-001408: Unsatisfied dependencies for type Customer with qualifiers @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 作为外部库包含在内。这里有人可以帮助我吗?提前谢谢大家。

要注入对象,其 class 必须为 CDI 机制所知。通常添加 @Named 注释就可以了。

您需要使用@Named 或@Model 注释来注释您的客户class:

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

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

您的 Customer class 必须作为 bean 被 CDI 发现。为此,您有两个选择:

  1. 放一个bean defining annotation就可以了。由于 @Model 是一种刻板印象,这就是它起作用的原因。像 @Named 这样的限定符不是定义注释的 bean,这是它不起作用的原因

  2. 通过在您的 jar 中添加一个 beans.xml 文件,将 bean discovery mode in your bean archive 从默认的 "annotated" 更改为 "all"。

请记住,@Named 只有一种用法:将您的 bean 暴露给 UI。其他用法是为了不良做法或与遗留框架的兼容性。

确保导入正确也是一件好事

我遇到了这样的问题,我发现这个 bean 正在使用

    javax.faces.view.ViewScoped;
                 ^

而不是

    javax.faces.bean.ViewScoped;
                 ^

我遇到了同样的问题,但它与注释无关。在我的容器 (Jboss EAP 6.3) 中索引 beans 时发生了问题。我的一个 bean 无法被索引,因为它使用了 Java 8 个特性,我在部署时收到了这个偷偷摸摸的小警告:

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

然后在注入点报错:

Unsatisfied dependencies for type ... with qualifiers @Default

解决方案是更新 Java 注释索引。下载新版本的 jandex(jandex-1.2.3.Final 或更新版本)然后将其放入

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

注意:EAP 6.4.x 已修复此问题

当您将项目从“war”更改为“jar”时,就像另一位朋友在 Jboss论坛:

这里有类似的问题,对我来说问题是 bean class 没有默认构造函数,因此框架无法实例化它。

确保您的 bean 始终 具有具有默认 (no-args) 签名的构造函数