我关注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());
}
}
答案 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将按预期工作
快乐编码