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 发现。为此,您有两个选择:
放一个bean defining annotation就可以了。由于 @Model
是一种刻板印象,这就是它起作用的原因。像 @Named
这样的限定符不是定义注释的 bean,这是它不起作用的原因
通过在您的 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) 签名的构造函数
我是 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 发现。为此,您有两个选择:
放一个bean defining annotation就可以了。由于
@Model
是一种刻板印象,这就是它起作用的原因。像@Named
这样的限定符不是定义注释的 bean,这是它不起作用的原因通过在您的 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) 签名的构造函数