【问题标题】:CDI injectionpoint @httpparam problemCDI注入点@httpparam问题
【发布时间】:2010-09-06 06:06:17
【问题描述】:

我关注Weld's doc

在第 4.11 节中。 InjectionPoint 对象

有一个非常有趣的例子是关于如何使用CDI获取http参数

但我将代码复制粘贴到 netbeans 中,一切都可以编译,但有一个部署错误

原因:org.jboss.weld.exceptions.DeploymentException: WELD-001408 注入点具有不满足的依赖关系。注入点:java.lang.String com.test.HttpParamProducer.getParamValue(javax.enterprise.inject.spi.InjectionPoint,javax.servlet.ServletRequest)的参数1;限定符:[@javax.enterprise.inject.Default()]

这个问题怎么解决???

public class HttpParamProducer {

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

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

   }
}

【问题讨论】:

  • 这是一个非常酷的主意!您是否找到了可行的解决方案?

标签: java-ee-6 cdi


【解决方案1】:

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

【讨论】:

  • weld 用户指南:CDI 规范不要求将 servlet 上下文对象 HttpServletRequest、HttpSession 和 ServletContext 作为可注入 bean 公开。如果你真的希望能够注入这些对象,很容易创建一个可移植的扩展来将它们公开为 bean....
  • 你有任何关于暴露 HttpServletRequest 的示例吗?
【解决方案2】:

看来两年后,这个问题还是有兴趣的

这是 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 将按预期工作

快乐编码

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 2017-02-16
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2012-04-21
    • 2023-04-07
    相关资源
    最近更新 更多