Проблема с базовой инжекцией зависимости пружины, когда нет установщика, а только получателя - PullRequest
0 голосов
/ 23 мая 2011

У меня есть сценарий, в котором мне нужно ввести значения в Arraylist в классе, в котором нет установщика. Я считаю, что в этом сценарии мне нужно получить доступ к списку в классе POC, а затем добавить:1001 *

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: недопустимое свойство 'beheaviour' класса bean-компонента [outBoundocument.factory.POC]: свойство bean-компонента beheaviour недоступно для записи или имеет недопустимый метод установки.Соответствует ли тип параметра установщика типу возвращаемого значения получателя?

У меня нет контроля над классом POC, так как он предоставляется классом, предоставленным внешним поставщиком, и я не могу сделать в него конструктор, поскольку единственный способ добавить значения в него следующим образом:

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

Ответы [ 2 ]

3 голосов
/ 23 мая 2011

Вы можете написать собственный 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>
1 голос
/ 23 мая 2011

Насколько я знаю, Spring не сможет вам здесь помочь (если у вас нет доступа к коду).Spring только позволяет вам работать с классами с закрытым исходным кодом в качестве bean-компонентов, если вы определите его в XML, что, в свою очередь, делает невозможным внедрение атрибутов.

Если вы не привязаны к Spring, вы можете делать то, что вам нужно с Java Reflection .


ОБНОВЛЕНИЕ

Извинения, кажется, выможет автоматически подключаться через XML.Посмотрите здесь .

...