WELD-001408:具有限定符@Default的Customer类型的不满意依赖项

时间:2015-02-05 19:32:13

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

我是一名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作为外部库。谁在这里可以帮助我?提前谢谢大家。

6 个答案:

答案 0 :(得分:52)

CDI必须将您的Customer类作为bean发现。为此你有两个选择:

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

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

  3. 请记住@Named只有一个用法:将bean公开给UI。其他用法是针对不良做法或与遗留框架的兼容性。

答案 1 :(得分:1)

确保您拥有正确的导入

也是一件好事

我有这样的问题,我发现豆子正在使用

    javax.faces.view.ViewScoped;

而不是

    javax.faces.bean.ViewScoped;

有时一句话可能毁了这个世界......或者在这种情况下毁了我的一天。

答案 2 :(得分:0)

我遇到了同样的问题,但是与注解无关。在我的容器中索引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 \ layers \ base \ org \ jboss \ jandex \ main,然后在module.xml中更新对新文件的引用

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

答案 3 :(得分:0)

当你把你的项目从“war”改为“jar”时,就像另一个朋友在 Jboss 论坛上说的:

enter image description here

答案 4 :(得分:-1)

您需要使用@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>

答案 5 :(得分:-2)

要注入一个Object,CDI机制必须知道它的类。通常添加@Named注释就可以了。