По тем же источникам мой коллега обнаружил:
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'service.MenuService#0'
defined in class path resource [spring-beans/integrator.xml]:
Could not resolve matching constructor (hint: specify index/type/name
arguments for simple parameters to avoid type ambiguities)
пока мой хост, тестовый и производственный серверы не имеют такой ошибки.
С:
<bean class="service.MenuService">
<constructor-arg index="0" type="java.lang.String" value="#{user}"/>
<constructor-arg index="1" type="java.lang.String" value="#{password}"/>
<constructor-arg index="2" type="java.lang.String" value="#{uri}"/>
<property name="system" value="OPRT"/>
<property name="client" value="OPRT"/>
</bean>
в то время как в bean-компоненте только один 3-аргументный конструктор.
Причина использования конструктора - он выполняет некоторые дополнительные действия с библиотекой, отличной от Spring, вызывая метод init()
. И установите args как поля.
Так что я меняю spring-beans.xml
на:
<bean class="service.MenuService" init-method="init">
<property name="login" value="#{user}"/>
<property name="password" value="#{password}"/>
<property name="httpsUrl" value="#{uri}"/>
<property name="system" value="OPRT" />
<property name="client" value="OPRT" />
</bean>
Обратите внимание на init-method=
часть.
ОБНОВЛЕНИЕ В конце концов я написал простой XML-конфиг и пошагово прошёл исходный код Spring в отладчике. Кажется, что в Spring 3.x возможно объединить constructor-arg и свойство в XML bean определение (проверка doCreateBean в AbstractAutowireCapableBeanFactory.java
, который вызывает createBeanInstance и populateBean next).
Смотри также https://softwareengineering.stackexchange.com/questions/149378/both-constructor-and-setter-injection-together-in-spring/