【问题标题】:WELD-001408: Unsatisfied dependencies for type Customer with qualifiers @DefaultWELD-001408:具有限定符 @Default 的 Customer 类型的依赖关系不满足
【发布时间】:2015-04-05 19:25:59
【问题描述】:

我是 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.

我的代码如下: 客户.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 作为外部库。这里有人可以帮助我吗?提前谢谢大家。

【问题讨论】:

  • 我认为您的问题是客户不是@Named。
  • CDI 是否知道 Customer 类(例如托管 bean 或(本地)EJB)?
  • 大家好,这真的很有帮助,谢谢!!实际上,用 注释类“customer”是行不通的,但是用 就可以了。但是为什么...?
  • 在下面为您提供正确且记录在案的答案。
  • 由于这是本主题中访问量最大的问题,因此我在此处添加 2 美分。 如果您碰巧在多模块 Maven 环境中工作,请确保在添加下面提到的任何 bean 定义注释后编译包含您的 bean 的模块

标签: jsf jakarta-ee dependency-injection cdi managed-bean


【解决方案1】:

要注入一个对象,CDI 机制必须知道它的类。通常添加 @Named 注释就可以解决问题。

【讨论】:

  • 错了,“@Named”没有把一个类变成一个bean。
【解决方案2】:

您需要使用 @Named 或 @Model 注解来注解您的 Customer 类:

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>

【讨论】:

【解决方案3】:

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

  1. 在上面写上bean defining annotation。由于@Model 是一种刻板印象,所以它可以做到这一点。 @Named 之类的限定符不是 bean 定义注释,这是它不起作用的原因

  2. 通过在您的 jar 中添加 beans.xml 文件,将 bean discovery mode in your bean archive 从默认的“带注释”更改为“全部”。

请记住,@Named 只有一种用途:将 bean 暴露给 UI。其他用法用于不良做法或与旧框架的兼容性。

【讨论】:

  • 您好,注解 Named 是必须的。如果相同的接口由不同的类实现,那么@Named 是必须的。在这种情况下必须使用它,而不仅仅是 UI。问候桑吉夫
  • 您好,感谢您的回复。你能修复第一个链接吗?提前谢谢!
【解决方案4】:

确保您有正确的导入也是一件好事

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

    javax.faces.view.ViewScoped;
                 ^

而不是

    javax.faces.bean.ViewScoped;
                 ^

【讨论】:

    【解决方案5】:

    我有同样的问题,但它与注释无关。在我的容器(Jboss EAP 6.3)中索引 bean 时发生了问题。我的一个 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\layers\base\org\jboss\jandex\main 然后更新对module.xml中新文件的引用

    注意:EAP 6.4.x 已经修复了这个问题

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2015-06-10
        • 2018-12-19
        • 2014-12-20
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 2015-02-09
        相关资源
        最近更新 更多