Jakarta ee 在JSF2.1+中,焊接CDI可以@Inject而不声明a@产生什么;应用
在JSF2.1+应用程序中,什么焊接CDI可以@Inject而不声明@products 据我所知,它可以在正确设置的web应用程序中注入FacesContext 它能注入:Jakarta ee 在JSF2.1+中,焊接CDI可以@Inject而不声明a@产生什么;应用,jakarta-ee,servlets,dependency-injection,cdi,weld,Jakarta Ee,Servlets,Dependency Injection,Cdi,Weld,在JSF2.1+应用程序中,什么焊接CDI可以@Inject而不声明@products 据我所知,它可以在正确设置的web应用程序中注入FacesContext 它能注入: HttpSession web.xml中的context参数(ala ServletContext.getInitParameter(xxx)) web.xml中的env ref 好的,这是我自己对这个问题的回答 有一个孵化的Apache项目 DeltaSpike由许多可移植的CDI扩展组成,这些扩展为Java应用程序开发
- HttpSession
- web.xml中的context参数(ala ServletContext.getInitParameter(xxx))
- web.xml中的env ref
- 好的,这是我自己对这个问题的回答
有一个孵化的Apache项目
DeltaSpike由许多可移植的CDI扩展组成,这些扩展为Java应用程序开发人员提供了有用的特性
根据文档,Servlet模块允许注入ServletContext、HttpSession和Principal对象
然而,我选择了另一条路径,使用@Producer方法和InjectionPoint参数自己实现了上下文参数注入。其实很简单
首先为参数创建一个注释,该注释将保存context param name属性
@限定符
@目标({ElementType.FIELD,ElementType.METHOD})
@保留(RetentionPolicy.RUNTIME)
public@interface WebContextParameter{
@非绑定字符串值()默认为“”;
}
注释属性名称()必须声明为@Nonbinding
,以便CDI不会将其用作限定过程的一部分
第二,使用@product方法创建生产者bean
公共类WebContextParameterExproducer{
@注入
私有服务上下文;
@产生
@WebContextParameter()
公共字符串createWebContextParameter(注入点ip){
WebContextParameter注释=null;
for(Iterator it=ip.getQualifiers().Iterator();it.hasNext();){
注释n=it.next();
if(n.annotationType().equals(WebContextParameter.class)){
注释=(WebContextParameter)n;
打破
}
}
返回context.getInitParameter(annotation.value());
}
}
之后,请在代码中的任意位置使用:
@Inject
@WebContextParameter("my.config.option")
String myConfigOption = "default-value";
但是,请注意,“默认值”仅在非CDI环境中使用。在CDI中,如果在web.xml中找不到任何值,myConfigOption
将设置为null
。可以扩展此示例,在注释中添加额外的defaultValue()
属性以缓解此问题
因此,基本上,ServletContext已经是@Inject可注入的,因此它的其余部分也是可注入的。据我测试(也根据测试),您可以在JavaEE环境中注入javax.security.Principal
和javax.transaction.UserTransaction
。这在JBossAS7.2和CDI版本1.1-PRD
上非常适用
对于Servlet容器,它负责为您的应用程序注入这些对象
javax.servlet.http.HttpServletRequest
javax.servlet.http.HttpSession
javax.servlet.ServletContext
然而,并不是每个容器都能真正支持这一点(我也没有测试这一点,但我认为它应该可以工作——我已经在某个地方看到了这段代码)。不,没有一个容器可以通过CDI本机注入。当John说“extension”时,您需要使用某种类型的扩展。最简单的方法是使用来自诸如Servlet过滤器或Servlet侦听器(侦听器更容易一些)的生产者。