定义生产者注释的值时出现焊接异常
Weld exception when value for producer annotation is defined
我试图从另一个 SO 问题中实现解决方案:
但并非在所有情况下都有效。
当我将此代码放入 CDI bean 时(bean 代码显示在底部):
@Inject @HttpParam
private String code;
一切正常。但是当我尝试为 @HttpParam 注释定义值时(因此,不是默认值)Weld 无法启动:
@Inject @HttpParam(value="code")
private String token;
我得到这个异常:
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type String with qualifiers @HttpParam
at injection point [BackedAnnotatedField] @Inject @HttpParam private org.test.site.jsf.beans.request.ActivationBean.token
at org.test.site.jsf.beans.request.ActivationBean.token(ActivationBean.java:0)
WELD-001475: The following beans match by type, but none have matching qualifiers:
- Producer Method [String] with qualifiers [@HttpParam @Any] declared as [[BackedAnnotatedMethod] @Produces @HttpParam public org.test.site.cdi.producer.HttpParamProducer.getHttpParameter(InjectionPoint)]
at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281)
at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:155)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518)
at org.jboss.weld.bootstrap.ConcurrentValidator.doWork(ConcurrentValidator.java:68)
at org.jboss.weld.bootstrap.ConcurrentValidator.doWork(ConcurrentValidator.java:66)
at org.jboss.weld.executor.IterativeWorkerTaskFactory.call(IterativeWorkerTaskFactory.java:63)
at org.jboss.weld.executor.IterativeWorkerTaskFactory.call(IterativeWorkerTaskFactory.java:56)
... 4 more
我使用的代码类似于链接的 SO 问题。
自定义@HttpParam注解:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER})
public @interface HttpParam {
public String value() default "";
}
注解值生产者:
public class HttpParamProducer {
@Inject
FacesContext facesContext;
@Produces
@HttpParam
String getHttpParameter(InjectionPoint ip) {
String name = ip.getAnnotated().getAnnotation(HttpParam.class).value();
if ("".equals(name)) name = ip.getMember().getName();
return facesContext.getExternalContext()
.getRequestParameterMap()
.get(name);
}
}
使用它的 CDI bean 类似于:
@Named("activation")
@RequestScoped
public class ActivationBean implements Serializable{
@Inject
@HttpParam(value="code")
private String token;
// rest of valid class code
}
我也在使用 Tomcat 8 服务器和 Weld Servlet 2.3。1.Final。
所以..我做错了什么? :-/
您需要将 @Nonbinding
添加到您的 value
属性,这样它的值就不一定 select 要调用哪个生产者方法,但允许单个工厂风格的生产者检查您的注入点.
您可能还想查看 what is the purpose of @Nonbinding annotation in a Qualifier supposed to be in Java EE7?
默认情况下,CDI 限定符中的属性也用于确定要注入的 bean。
因为你注入了 @HttpParam(value="code")
,但是你的生产者只生产了 @HttpParam(value="")
。它们不匹配,CDI 不知道要注入什么。
要使 CDI 在确定要注入的 bean 时忽略 CDI 限定符中的属性,您可以在这些属性上标记 @Nonbinding
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER})
public @interface HttpParam {
@Nonbinding
public String value() default "";
}
我来晚了,但是为了其他可能使用这个问题编写类似的基于参数的注入的人,让我添加这个。
添加一个我在上面没有找到的具体内容。我遇到了同样的情况,但是 flavor.My Qualifier
和 Producer
方法有所不同在一个模块中(比如injector-module
)与我进行注射的模块不同(比如injected-module
).所有 NonBinding
注释已给出。
然而,我只有 injected-module
.beans.xml.
注入失败。
在 injector-module
的 META-INF 中添加 beans.xml 就成功了。
我试图从另一个 SO 问题中实现解决方案: 但并非在所有情况下都有效。
当我将此代码放入 CDI bean 时(bean 代码显示在底部):
@Inject @HttpParam
private String code;
一切正常。但是当我尝试为 @HttpParam 注释定义值时(因此,不是默认值)Weld 无法启动:
@Inject @HttpParam(value="code")
private String token;
我得到这个异常:
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type String with qualifiers @HttpParam
at injection point [BackedAnnotatedField] @Inject @HttpParam private org.test.site.jsf.beans.request.ActivationBean.token
at org.test.site.jsf.beans.request.ActivationBean.token(ActivationBean.java:0)
WELD-001475: The following beans match by type, but none have matching qualifiers:
- Producer Method [String] with qualifiers [@HttpParam @Any] declared as [[BackedAnnotatedMethod] @Produces @HttpParam public org.test.site.cdi.producer.HttpParamProducer.getHttpParameter(InjectionPoint)]
at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281)
at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:155)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518)
at org.jboss.weld.bootstrap.ConcurrentValidator.doWork(ConcurrentValidator.java:68)
at org.jboss.weld.bootstrap.ConcurrentValidator.doWork(ConcurrentValidator.java:66)
at org.jboss.weld.executor.IterativeWorkerTaskFactory.call(IterativeWorkerTaskFactory.java:63)
at org.jboss.weld.executor.IterativeWorkerTaskFactory.call(IterativeWorkerTaskFactory.java:56)
... 4 more
我使用的代码类似于链接的 SO 问题。
自定义@HttpParam注解:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER})
public @interface HttpParam {
public String value() default "";
}
注解值生产者:
public class HttpParamProducer {
@Inject
FacesContext facesContext;
@Produces
@HttpParam
String getHttpParameter(InjectionPoint ip) {
String name = ip.getAnnotated().getAnnotation(HttpParam.class).value();
if ("".equals(name)) name = ip.getMember().getName();
return facesContext.getExternalContext()
.getRequestParameterMap()
.get(name);
}
}
使用它的 CDI bean 类似于:
@Named("activation")
@RequestScoped
public class ActivationBean implements Serializable{
@Inject
@HttpParam(value="code")
private String token;
// rest of valid class code
}
我也在使用 Tomcat 8 服务器和 Weld Servlet 2.3。1.Final。
所以..我做错了什么? :-/
您需要将 @Nonbinding
添加到您的 value
属性,这样它的值就不一定 select 要调用哪个生产者方法,但允许单个工厂风格的生产者检查您的注入点.
您可能还想查看 what is the purpose of @Nonbinding annotation in a Qualifier supposed to be in Java EE7?
默认情况下,CDI 限定符中的属性也用于确定要注入的 bean。
因为你注入了 @HttpParam(value="code")
,但是你的生产者只生产了 @HttpParam(value="")
。它们不匹配,CDI 不知道要注入什么。
要使 CDI 在确定要注入的 bean 时忽略 CDI 限定符中的属性,您可以在这些属性上标记 @Nonbinding
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER})
public @interface HttpParam {
@Nonbinding
public String value() default "";
}
我来晚了,但是为了其他可能使用这个问题编写类似的基于参数的注入的人,让我添加这个。
添加一个我在上面没有找到的具体内容。我遇到了同样的情况,但是 flavor.My Qualifier
和 Producer
方法有所不同在一个模块中(比如injector-module
)与我进行注射的模块不同(比如injected-module
).所有 NonBinding
注释已给出。
然而,我只有 injected-module
.beans.xml.
注入失败。
在 injector-module
的 META-INF 中添加 beans.xml 就成功了。