类型 String Jboss6 的不满足依赖关系
Unsatisfied dependencies for type String Jboss6
出现错误,不知道为什么,因为我在两个受影响的模块中都使用了 beans.xml
。
WELD-001408 Unsatisfied dependencies for type [String] with qualifiers [@SystemProperty] at injection point [[parameter 1] of [constructor] @Inject public com.comp.alert.EmailAlertHandler(String, String)]
SystemProperty.java:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
public @interface SystemProperty {
@Nonbinding String value();
}
EmailAlertHandler.java(只包含了使用@Systemproperty的部分代码:
@Email
@Stateless
public class EmailAlertHandler implements AlertHandler {
@Inject
public EmailAlertHandler(@SystemProperty("min.email.from") String emailFrom,
@SystemProperty("min.email.to") String emailTo) {
this.emailFrom = emailFrom;
this.emailTo = emailTo;
}
@Override
public void sendAlert(Alert alert) {
//body omitted
}
}
beans.xml 在 EmailAlertHandler 模块中定义:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"/>
beans.xml 在模块中为 SystemProperty 定义:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"/>
这里注入了EmailAlertHandler。在另一个 class 中调用 sendAlertAsync 方法以从根本上启动该功能:
@Singleton
@Startup
public class AlertManager {
@Inject @Email
private AlertHandler emailAlertHandler;
@Asynchronous
public void sendAlertAsync(Alert alert) {
// Handle alert via email
emailAlertHandler.sendAlert(alert);
}
}
基本上我已经找到的关于类似 unsatisfied/missing 依赖错误的所有解决方案都指向配置 beans.xml 但这并没有解决任何问题。
看起来没有任何东西产生这些字符串。
你们有制作人吗?
您可以试试:
public class PropertyProducer {
@Produces
public String createProperty(InjectionPoint injectionPoint) {
String value =injectionPoint.getAnnotation(SystemProperty.class).value();
return System.getProperty(value);
}
}
出现错误,不知道为什么,因为我在两个受影响的模块中都使用了 beans.xml
。
WELD-001408 Unsatisfied dependencies for type [String] with qualifiers [@SystemProperty] at injection point [[parameter 1] of [constructor] @Inject public com.comp.alert.EmailAlertHandler(String, String)]
SystemProperty.java:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
public @interface SystemProperty {
@Nonbinding String value();
}
EmailAlertHandler.java(只包含了使用@Systemproperty的部分代码:
@Email
@Stateless
public class EmailAlertHandler implements AlertHandler {
@Inject
public EmailAlertHandler(@SystemProperty("min.email.from") String emailFrom,
@SystemProperty("min.email.to") String emailTo) {
this.emailFrom = emailFrom;
this.emailTo = emailTo;
}
@Override
public void sendAlert(Alert alert) {
//body omitted
}
}
beans.xml 在 EmailAlertHandler 模块中定义:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"/>
beans.xml 在模块中为 SystemProperty 定义:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"/>
这里注入了EmailAlertHandler。在另一个 class 中调用 sendAlertAsync 方法以从根本上启动该功能:
@Singleton
@Startup
public class AlertManager {
@Inject @Email
private AlertHandler emailAlertHandler;
@Asynchronous
public void sendAlertAsync(Alert alert) {
// Handle alert via email
emailAlertHandler.sendAlert(alert);
}
}
基本上我已经找到的关于类似 unsatisfied/missing 依赖错误的所有解决方案都指向配置 beans.xml 但这并没有解决任何问题。
看起来没有任何东西产生这些字符串。
你们有制作人吗?
您可以试试:
public class PropertyProducer {
@Produces
public String createProperty(InjectionPoint injectionPoint) {
String value =injectionPoint.getAnnotation(SystemProperty.class).value();
return System.getProperty(value);
}
}