【问题标题】:Injection of constructor attributes注入构造函数属性
【发布时间】:2012-10-02 13:06:58
【问题描述】:

我正在注入一个列表,该列表将填充类中使用的地图。

但是当注入流动属性时:

private List<?> srcSystemIDList;

通过流动的 XML:

<bean id="transformerHelper" class="com.common.TransformerHelper">
        <property name="srcSystemIDList" value="#{ T(java.util.Arrays).asList('6','57','92','93','7','108','106','105','98','52','122','9','26','51','101','102','118') }" />
</bean>

这个方法用来设置地图的:

    public void srcSystemIDListInit()
{
        Object[] srcSystemArray = srcSystemIDList.toArray();
        int j;
        for(int i = 0; i< srcSystemArray.length; i = i+2)
        {
            j = i + 1;

            if(j < srcSystemArray.length)
            {
                srcSystemIDMap.put(srcSystemArray[i].toString(), srcSystemArray[j].toString());
            }
        }
}

我通过构造函数调用它。

public TransformerHelper()
{
    srcSystemIDListInit();
} 

但是,当构造函数调用该方法时,列表为空并抛出空指针异常。

如何通过注入列表填充地图

【问题讨论】:

  • 你试过用@Resource注释srcSystemIDList吗?

标签: java spring code-injection


【解决方案1】:

你可以按照 Vikdor 说的做,或者你也可以采取其他几种方法。

  1. 你可以调用这个方法,不是从构造函数,而是从你的setter方法setSrcSystemIDList(...)。这将需要最少的工作。 (但实际上,所有这些建议都很容易......)
  2. 您可以实现InitializingBean 接口,并从那里调用您的方法。
  3. 您可以使用 @PostConstruct 注释该方法。
  4. 您可以将init-method 属性添加到您的bean xml,它指定要调用的方法。

【讨论】:

    【解决方案2】:

    如果你想通过构造函数注入,那么你应该将你的构造函数声明为

    public TransformerHelper(List<?> srcSystemIDList)
    {
        this.srcSystemIDList = srcSystemIDList;
        srcSystemIDListInit();
    }
    

    你的 bean 定义应该是

    <bean id="transformerHelper" class="com.common.TransformerHelper">
        <constructor-arg value="#{ T(java.util.Arrays).asList('6','57','92','93','7','108','106','105','98','52','122','9','26','51','101','102','118') }" />
    </bean>
    

    【讨论】:

      【解决方案3】:

      您可以从属性设置器调用初始化:

      public void setSrcSystemIDList(List<?> srcSystemIDList) {
          this.srcSystemIDList = srcSystemIDList;
          srcSystemIDListInit();
      }
      

      并按原样使用您的弹簧配置。

      或者定义一个带参数的构造函数:

      public TransformerHelper(List<?> srcSystemIDList) {
          this.srcSystemIDList = srcSystemIDList;
          srcSystemIDListInit();
      } 
      

      并在spring配置中将列表作为构造函数参数传递:

      <bean id="transformerHelper" class="com.common.TransformerHelper">
             <constructor-arg value="#{  T(java.util.Arrays).asList('6','57','92','93','7','108','106','105','98','52','122','9','26','51','101','102','118') }" />
      </bean>
      

      【讨论】:

        【解决方案4】:

        你应该看看这样的东西

        <bean id="transformerHelper" class="com.common.TransformerHelper">
            <constructor-arg><ref bean="yourListBean"></constructor-arg>
        </bean>
        

        访问Source了解更多信息。

        干杯,

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多