CDI注入点@httpparam问题

时间:2010-09-06 06:06:18

标签: java-ee-6 cdi

我关注Weld's doc

在4.11节中。 InjectionPoint对象

有一个非常有趣的例子,说明如何使用CDI获取http参数

但是我将代码复制粘贴到netbeans中,所有内容都编译,但有部署错误

引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408注入点具有不满足的依赖性。注入点:java.lang.String的参数1 com.test.HttpParamProducer.getParamValue(javax.enterprise.inject.spi.InjectionPoint,javax.servlet.ServletRequest);资格赛:[@ javax.enterprise.inject.Default()]

如何解决这个问题???

public class HttpParamProducer {

   @HttpParam("")
   @Produces
   String getParamValue(
           InjectionPoint ip, ServletRequest request) {

      return request.getParameter(ip.getAnnotated().getAnnotation(HttpParam.class).value());

   }
}

2 个答案:

答案 0 :(得分:0)

生成器方法的每个参数都被注入,并且没有任何bean(包括生成器)提供API类型ServletRequest来满足此注入点。

答案 1 :(得分:0)

似乎两年后,这个问题仍然感兴趣

这是CDI规范的简称,它不需要容器将HttpServletRequest公开为可注入bean

这是一个合理的工作

@WebListener 
public class HttpServletRequestProducer implements ServletRequestListener {
    private final static ThreadLocal<HttpServletRequest> holder = new ThreadLocal<HttpServletRequest>();

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        holder.remove();
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        holder.set((HttpServletRequest)sre.getServletRequest());
    }

    @Produces @RequestScoped HttpServletRequest get() {
        return holder.get();
    }
}

现在@Inject HttpServletRequest将按预期工作

快乐编码