Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Sobre spring, hibernate y apache-cxf

Buenas tardes, tengo un problema a la hora de desplegar un war formado con estas 3 tecnologías. En concreto las versiones son apache-cxf v 2.5.2, spring 2.5.6 e hibernate v v 3.2.1. Estoy usando anotaciones, por aprender esta nueva forma que spring nos provee.
Me esta dando esta excepción:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'storeService': Can not resolve reference to bean 'storeService' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'storeService': Requested bean is Currently in creation: is there an unresolvable loop reference?

storeService es la implementacion del servicio Web, que esta definido en un fichero que he llamado beans.xml. Esta es su definición:

<?xml version="1.0" encoding="UTF-8"?>




<!-- DECLARACION DE LOS ENDPOINTS DE LOS WEB SERVICES-->
<jaxws:endpoint
id="storeService" implementor="#storeService"
implementorClass="com.aironman.core.cxf.service.StoreServiceImpl"
address="/Store" />

El applicationContext.xml es tal que asi:

<?xml version="1.0" encoding="UTF-8"?>

<context:component-scan base-package="com.aironman.core" />
<tx:annotation-driven transaction-manager="txManager"/>

<property name="sessionFactory" ref="sessionFactory"/>


<property name="location" value="classpath:hibernate.properties"/>


<property name="driverClassName" value="${database.driverClassName}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="sa"/>
<property name="password" value=""/>


<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<value>
hibernate.dialect=${database.hibernate.dialect}
hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider
hibernate.show_sql=true
hibernate.use_sql_comments=true
hibernate.jdbc.batch_size=0
hibernate.hbm2ddl.auto=create-drop
hibernate.default_schema=${hibernate.default_schema}
hibernate.generate_statistics=true
hibernate.cache.use_structured_entries=true
</value>
</property>
<property name="annotatedClasses">
<list>
<value>com.aironman.core.pojos.Usuario</value>
<value>com.aironman.core.pojos.Item</value>
<value>com.aironman.core.pojos.Persona</value>
</list>
</property>

Ambos ficheros están incluidos en el web.xml.
Esta es una aproximacion de la implementacion del servicio web, que tiene a su vez otras dependencias:

@Service("storeService")
@WebService(endpointInterface = "com.aironman.core.cxf.service.StoreService")
public class StoreServiceImpl implements StoreService[/B] {
private Log log = LogFactory.getLog(StoreServiceImpl.class);
@Autowired
@Qualifier("servicioUsuarios")
private ServicioUsuarios servicioUsuarios;
@Autowired
@Qualifier("servicioItems")
private ServicioItems servicioItems;
@Autowired
@Qualifier("servicioApuntes")
private ServicioApuntesContables servicioApuntesContables;
[B]public StoreServiceImpl()[/B]{
log.info("CONSTRUCTOR SIN tipo StoreServiceImpl...");
}
some methods... getters and setters ...
}

Esta es la implementacion del servicioUsuarios, no la pongo completa pq no me cabria todo el post :)

package com.aironman.core.service;
[B]@Service("servicioUsuarios")
public class ServicioUsuariosImpl implements ServicioUsuarios [/B]{
private static ConcurrentHashMap <String,Usuario>hashMapUsuarios = new ConcurrentHashMap <String,Usuario> () ;
private Log log = LogFactory.getLog(ServicioUsuariosImpl.class);
@Autowired
@Qualifier("servicioEncriptacion")
private ServicioEncriptacion servicioEncriptacion;
@Autowired
@Qualifier("servicioPersistenciaUsuarios")
private ServicioPersistenciaUsuarios servicioPersistenciaUsuarios;
[B]public ServicioUsuariosImpl()[/B]{
log.info("Constructor SIN tipo ServicioUsuariosImpl...");
//TODO pendiente cargar el mapa con una llamada al servicioPersistencia
}
[B]@PostConstruct
public void init()[/B]
{
log.info("init method on ServicioUsuariosImpl. Initializing hashMap...");
//i need to call persistence layer to fill the hashMap
}
some methods, getters and setters
}

Como podeis ver, este servicio tiene inyectado una capa de persistencia llamado ServicioPersistenciaUsuarios, el cual usa un dao marcado como @repository

package com.aironman.core.service;
[B]@Service("servicioPersistenciaUsuarios")
public class ServicioPersistenciaUsuariosImpl implements ServicioPersistenciaUsuarios [/B]{
@Autowired
@Qualifier("usuarioHibernateDao")
private UsuarioHibernateDao usuarioHibernateDao;
private Log log = LogFactory.getLog(ServicioPersistenciaUsuariosImpl.class);
public ServicioPersistenciaUsuariosImpl()
{
log.info("Constructor ServicioPersistenciaUsuariosImpl...");
}
some methods, getters and setters
}

Este es la implementacion del dao de usuarios, muy simple e incompleto pq no me cabe.

package com.aironman.core.hibernate;
[B]@Repository
public class UsuarioHibernateDao extends HibernateGenericDao<Usuario, String> implements UsuarioDao
[/B]{
private Log log = LogFactory.getLog(UsuarioHibernateDao.class);
[B]@Autowired
public UsuarioHibernateDao(@Qualifier("sessionFactory") SessionFactory sessionFactory) [/B]{
super(sessionFactory);
}
some methods...
}

ServicioUsuariosImpl tiene otra dependencia, servicioEncriptacion

package com.aironman.core.service;
[B]@Service("servicioEncriptacion")
public class ServicioEncriptacionImpl implements ServicioEncriptacion[/B]{
private static final String algoritmo = "SHA-256";
private Log log = LogFactory.getLog(ServicioEncriptacionImpl.class);
private static java.security.MessageDigest diggest ;
[B]public ServicioEncriptacionImpl()[/B]
{some code...
}
some methods...
}

Otra dependencia de storeService es servicioItemsImpl

package com.aironman.core.service;
[B]@Service("servicioItems")
public class ServicioItemsImpl implements ServicioItems[/B]{
private static final ConcurrentHashMap
<String,com.aironman.core.pojos.Item>
//La pk es el isbn del item
hashMapItems = new ConcurrentHashMap<String,com.aironman.core.pojos.Item>() ;
private Log log = LogFactory.getLog(ServicioItemsImpl.class);
@Autowired
@Qualifier("servicioPersistenciaItems")
private ServicioPersistenciaItems servicioPersistenciaItems;
[B]public ServicioItemsImpl()[/B]
{
log.info("Constructor SIN TIPO ServicioItemsImpl");
}
[B]@PostConstruct
public void init()[/B]
{
log.info("init method on ServicioItemsImpl. Initializing hashMap...");
}
some methods, getters and setters
}

ServicioPersistenciaItemsImpl que es una dependencia de ServicioItemsImpl

package com.aironman.core.service;

@Service("servicioPersistenciaItems")
public class ServicioPersistenciaItemsImpl implements ServicioPersistenciaItems[/B]
{
@Autowired
@Qualifier("itemHibernateDao")
private ItemHibernateDao itemHibernateDao;
private Log log = LogFactory.getLog(ServicioPersistenciaItemsImpl.class);
[B]public ServicioPersistenciaItemsImpl()[/B]
{
log.info("Constructor SIN tipo ServicioPersistenciaItemsImpl...");
}
some methods, getters and setters...
}

y para acabar servicioApuntesContablesImpl, que por ahora no tengo ninguna dependencia, (aunque la tendrá).

package com.aironman.core.service;
[B]@Service("servicioApuntes")
public class ServicioApuntesContablesImpl implements ServicioApuntesContables[/B]{

private Log log = LogFactory.getLog(ServicioApuntesContablesImpl.class);
private static ConcurrentHashMap <ClaveApunteContable,ApunteContable> mapaApuntesContables
= new ConcurrentHashMap <ClaveApunteContable,ApunteContable> ();

//TODO al final tendre que persistir los apuntes contables, por ahora los mantendre en memoria...
[B]public ServicioApuntesContablesImpl()[/B]
{}
some methods
}

en resumen, el problema ocurre cuando spring intenta instanciar la implementación del endpoint y no entiendo el porque. En ppio spring tiene que resolver las dependencias por mi no? marcando los objetos con el @ necesario. No tengo constructores tipados, tengo los getters y setters necesarios...
Podria por favor alguien arrojarme algo de luz? llevo unos días buscando la solución leyendo en los foros oficiales y ya estoy algo desesperado.
No he puesto todo el código por motivos de facilidad de lectura y por no alcanzar un limite de caracteres.
Si alguien necesita que ponga el código de algo en particular, haganmelo saber.
Gracias por leer hasta aquí.

abril 1, 2012 | Registered Commenteraironman

Hola,
podrìas poner tu web.xml para ver que ficheros y como los estas cargando? es que es ahí donde tienes el problema. Mira el ContextConfigLocation y lo que le pasas como ficheros de configuracion a tus servlets.

abril 25, 2012 | Unregistered CommenterJavi.