Подтвердить что ты не робот

Spring Beans - как проложить нуль как конструктор arg?

У меня есть следующий bean:

<bean id="myBean" class="com.me.myapp.Widget">
    <constructor-arg name="fizz" value="null"/>
    <constructor-arg name="buzz" ref="someOtherBean" />
</bean>

Когда я запускаю свое приложение, Spring выдает исключение конфигурации bean:

[java] Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myBean' defined in class path resource [spring-config.xml]:
Unsatisfied dependency expressed through constructor argument with index 0
of type [com.me.myapp.Widget]: Could not convert constructor argument value of
type [java.lang.String] to required type [com.me.myapp.Widget]: Failed to
convert value of type 'java.lang.String' to required type
'com.me.myapp.Widget'; nested exception is java.lang.IllegalStateException:
Cannot convert value of type [java.lang.String] to required
type [com.me.myapp.Widget]: no matching editors or conversion strategy found

Я просто хочу создать Widget, как если бы я написал следующую Java:

Widget w = new Widget(null, someOtherBean);

Как я могу это сделать? Спасибо заранее!

4b9b3361

Ответ 1

Вы можете использовать тег Spring <null>:

<bean id="myBean" class="com.me.myapp.Widget">
    <constructor-arg name="fizz">
            <null />
    </constructor-arg>
    <constructor-arg name="buzz" ref="someOtherBean" />
</bean>

Ответ 2

Время spring не может вставлять значения в упорядоченное, указанное в конструкторе. Лучше, если вы попытаетесь с явным упорядочением, т.е.

<constructor-arg index="0" name="fizz"><null/></constructor-arg> 
<constructor-arg index="1" name="buzz"><ref bean="someOtherBean"/></constructor-arg>

Ответ 3

это, на самом деле, не работало для меня,

так что я сделал, не передавая объект через spring, но спрашивая "если объект имеет значение null" и создает новый объект и назначает ему его,

он также выполняется один раз (аналогично spring), разница в том, что это не лучшая практика, а точка создания объекта находится в потоке класса, а не на ранней стадии.