Jakarta ee 在JSF2.1+中,焊接CDI可以@Inject而不声明a@产生什么;应用

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应用程序开发

在JSF2.1+应用程序中,什么焊接CDI可以@Inject而不声明@products

据我所知,它可以在正确设置的web应用程序中注入FacesContext

它能注入:

  • 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侦听器(侦听器更容易一些)的生产者。