jsf - 定义生产者注释的值时出现焊接异常

标签 jsf cdi http-request-parameters producer

我试图从另一个 SO 问题中实现解决方案: https://stackoverflow.com/a/10059245/1943765但并非在所有情况下都有效。

当我将此代码放入 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$1.doWork(ConcurrentValidator.java:68)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.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 属性,这样它的值就不必选择调用哪个生产者方法,而是允许单个工厂样式生产者检查你的注入(inject)点。

您可能还想查看 what is the purpose of @Nonbinding annotation in a Qualifier supposed to be in Java EE7?

关于jsf - 定义生产者注释的值时出现焊接异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233842/

相关文章:

dependency-injection - 我可以在 quartz 调度程序作业中使用 CDI 注入(inject)吗?

Spring roo/ Spring mvc : how can i set uriencoding for controller method

java - JSF 富 :dataList rendered per row?

java - 无法将自定义 NavigationHandler 转换为 javax.faces.application.ConfigurableNavigationHandler

java - 如何在运行时从 JSF Controller 访问位于 "src/main/resources"文件夹中的 css 文件

java - <h :form target ="_blank" only after validation

java - CDI @Interceptor 的@Priority 的含义是什么?

ejb - CDI:@Decorator @Stateless

spring-boot - Spring 启动分页中的多个请求参数

java - 是否有一种声明性方法来根据请求字段之一验证请求参数?