【问题标题】:Issue with basic spring dependency injection where there is no setter just a getter基本弹簧依赖注入的问题,没有setter,只有getter
【发布时间】:2011-08-31 09:39:53
【问题描述】:

我有一个场景,我需要在一个没有 setter 的类中向 Arraylist 注入值/p>

public class POC {
  private  ArrayList<String> beheaviour=new ArrayList<String>();

  public ArrayList<String> getBeheaviour() {
    return beheaviour;
  }
}

这里是xml映射代码:

<bean id="poc" class="outBoundocument.factory.POC">
  <property name="beheaviour">
    <list>
      <value>temp1</value>
      <value>temp2</value>
      <value>temp3</value>
      <value>temp4</value>
      <value>temp5</value>
    </list>
  </property>   
</bean>

以下代码返回:

错误设置属性值;嵌套异常是 org.springframework.beans.NotWritablePropertyException:bean 类 [outBoundocument.factory.POC] 的无效属性“beheaviour”:Bean 属性“beheaviour”不可写或具有无效的 setter 方法。 setter 的参数类型是否与 getter 的返回类型匹配?

我无法控制 POC 类,因为它是外部供应商提供的类,我无法对其进行构造函数注入,因为向它添加值的唯一方法是通过以下方式:

POC poc=new POC();
poc.getBeheaviour().add("some Stuff")

【问题讨论】:

    标签: java spring dependencies code-injection setter


    【解决方案1】:

    据我所知,Spring 在这里无法为您提供帮助(如果您无权访问代码)。 Spring 仅允许您将 closed-source 类作为 bean 使用,前提是您在 XML 中定义它,这反过来又使得无法进行属性注入。

    如果您没有绑定到 Spring,您可以使用 Java Reflection 做您需要的事情。


    更新

    抱歉,您似乎可以通过 XML 自动装配。看看here

    【讨论】:

    • 感谢 Nico 的回复,是的,很遗憾,我无法通过 xml 自动装配,因此我们要求供应商进行更改并弃用这些方法。我希望 spring 会在下一个版本中提供一个实现。谢谢你的时间
    【解决方案2】:

    您可以编写一个自定义 FactoryBean 来添加项目。 在 Java 中是这样的:

    public class POCFactoryBean implements FactoryBean<POC> {
        private POC poc = new POC();    
        public void setBeheavior(List<String> items) {
            poc.getBehavior().addAll(items);
        }
        public POC getObject() {  
            return poc;
        }
        public Class<?> getObjectType() {   
            POC.class;
        }
        public boolean isSingleton() {
            return true;
        }
    }
    

    对应的XML:

    <bean id="poc" class="some.package.POCFactoryBean">
      <property name="beheaviour">
        <list>
          <value>temp1</value>
          <value>temp2</value>
          <value>temp3</value>
          <value>temp4</value>
          <value>temp5</value>
        </list>
      </property>   
    </bean>
    

    【讨论】:

    • 感谢 Pasi 的回复,问题是我有多个对象,大约在 250-260 之间,我必须为此创建一个工厂类,然后尝试在春季通过属性注入进行注入,因此我给如果这个方法只有 10 或 15 个,我会跳上它并实施它。谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2012-10-12
    • 2018-03-13
    相关资源
    最近更新 更多