2011-03-01 9 views
7
<bean id="cObject" scope="request" class="x.y.z.CClass"/> 
<bean id="bObject" scope="request" class="x.y.z.BClass"/> 
<bean id="aObject" scope="request" class="x.y.z.AClass"> 
    <constructor-arg ref="bObject" /> 
    <property name="cRef" ref="cObject" /> 
</bean> 

aObject.cRef no se establece por alguna razón. Tenga en cuenta que constructor-arg y property se usan en la misma definición. No he visto un ejemplo/publicación con una función similar.constructor-arg y propiedad juntos en la definición de bean

+2

¿Qué versión de la primavera? Funciona bien para mí con Spring 3.0.5. Además, intente configurar solo uno o el otro. Mi suposición es que tu problema no tiene nada que ver con mezclar propiedad y constructor-arg. – Damien

+1

Esta sintaxis está bien. ¿Estás seguro de que no estás tratando de usar 'cRef' de * dentro de * el constructor, porque no se habrá establecido en ese punto. – skaffman

+0

Comenzar con una sola letra minúscula para un frijol puede causar problemas con Spring, Jackson y otros que dependen de la especificación del frijol. Si cambiaste la propiedad a myCRef, ¿solucionó el problema? – Hazok

Respuesta

2

Mezclar <constructor-arg> y <property> es generalmente una mala idea.

Solo hay una buena razón para usar <constructor-arg>, y eso es para crear objetos inmutables.

Sin embargo, sus objetos no son inmutables si puede establecer sus propiedades. No use <constructor-arg>. Rediseñe la clase, utilice un método de inicialización anotado con @PostConstruct si necesita aplicar alguna lógica en el momento de creación del bean.

+0

Esa toma tiene sentido. Solucionado mediante el uso de autowire = "byName" y propiedades. De alguna manera, cuando struts crea una instancia del bean, no invocó el bean utilizando el constructor personalizado. Esta solución es más deseable. – anthos

2

Por mismas fuentes descubrir mi colega:

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) 

mientras mis servidores host, prueba y producción no tienen tal error.

Con:

<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> 

mientras que hay solamente un constructor de 3-args en frijol.

Motivo para usar el constructor: realiza algunas acciones adicionales en la biblioteca que no es Spring invocando el método init(). Y establece args como campos.

así que cambio spring-beans.xml a:

<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> 

tomar la atención a init-method= parte.

ACTUALIZACIÓN Después de todo, escribí configuración XML simple y paso a través del código fuente Spring en el depurador. Parece que con la primavera 3.x es posible combinar constructor-arg y propiedad en XML frijol definición (comprobar doCreateBean en AbstractAutowireCapableBeanFactory.java, que llaman createBeanInstance y populateBean siguiente).

Ver también https://softwareengineering.stackexchange.com/questions/149378/both-constructor-and-setter-injection-together-in-spring/

Cuestiones relacionadas