4

我遵循Weld 的文档

在第 4.11 节中。注入点对象

有一个非常有趣的例子是关于如何使用 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());

   }
}
4

2 回答 2

0

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

于 2011-01-18T23:21:00.930 回答
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 将按预期工作

快乐编码

于 2012-11-02T03:52:23.073 回答