我是一名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作为外部库。谁在这里可以帮助我?提前谢谢大家。
答案 0 :(得分:52)
CDI必须将您的Customer
类作为bean发现。为此你有两个选择:
在其上放置一个bean defining annotation。由于@Model
是一种刻板印象,因此它就是这样做的原因。像@Named
这样的限定符不是定义注释的bean,它不起作用的原因
通过在jar中添加beans.xml
文件,将bean discovery mode in your bean archive从默认的“带注释”更改为“全部”。
请记住@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)
答案 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注释就可以了。