关于BeanCurrentlyInCreationException,无法解析的循环引用

时间:2012-03-29 10:07:37

标签: spring hibernate cxf

下午好,我有一个基于apache-cxf v 2.5.2,spring 2.5.6和hibernate v v 3.2.1的项目。我正在使用注释标记我坚持的单位和对象,并在部署战争时遇到问题。给我以下例外: org.springframework.beans.factory.BeanCreationException:创建名为'storeService'的bean时出错:在设置构造函数参数时无法解析对bean'storeService'的引用;嵌套异常是org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为'storeService'的bean时出错:请求的bean当前正在创建:是否存在无法解析的循环引用?

这是applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
       ">
    <context:component-scan base-package="com.aironman.core" />
    <tx:annotation-driven transaction-manager="txManager"/>
    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:hibernate.properties"/>
    </bean>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url}"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <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>
    </bean>
</beans>

这是beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
        <!-- DECLARACION DE LOS ENDPOINTS DE LOS WEB SERVICES-->
        <jaxws:endpoint
      id="storeService" implementor="#storeService"
      implementorClass="com.aironman.core.cxf.service.StoreServiceImpl"
      address="/Store" />
</beans>

这两个文件都包含在 web.xml

这是实现端点Web服务storeService:

**@Service("storeService")
@WebService(endpointInterface = "com.aironman.core.cxf.service.StoreService")
public class StoreServiceImpl implements StoreService** {

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

这是ServicioUsuariosImpl文件:

package com.aironman.core.service;
**@Service("servicioUsuarios")
public class ServicioUsuariosImpl implements ServicioUsuarios** {
    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;
    public ServicioUsuariosImpl(){
        log.info("Constructor SIN tipo ServicioUsuariosImpl...");
        //TODO pendiente cargar el mapa con una llamada al servicioPersistencia
    }
    @PostConstruct
    public void init()
    {
        log.info("init method on ServicioUsuariosImpl. Initializing hashMap...");
        //i need to call persistence layer to fill the hashMap        
    }
    some methods, getters and setters
}

正如您所看到的,此服务已经提供了一个称为servicioPersistenciaUsuarios的持久服务,该服务基本上使用标记为@repository的dao。

这是ServicioPersistenciaUsuariosImpl实现文件:

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

这是usuarioHibernateDao实现文件:

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

ServicioUsuariosImpl有另一个依赖项,servicioEncriptacion,正如您所看到的,这是实现:

package com.aironman.core.service;
@Service("servicioEncriptacion")
public class ServicioEncriptacionImpl implements ServicioEncriptacion
{
      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...
    } 

这是ServicioItemsImpl实现文件,另一个依赖项属于StoreServiceImpl。

package com.aironman.core.service;
**@Service("servicioItems")
public class ServicioItemsImpl implements ServicioItems**{
    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
}

这是servicioPersistenciaItems实现文件:

package com.aironman.core.service;

@Service("servicioPersistenciaItems")
public class ServicioPersistenciaItemsImpl implements ServicioPersistenciaItems
{
    @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...
}

并完成,ServicioApuntesContablesImpl实现文件,没有依赖

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
}
简而言之,当Spring尝试实例化端点实现文件storeService并且不理解它时,问题就出现了,因为我在任何文件,getter和setter中都没有类型构造函数我有权使用以上任何依赖使用对彼此。有人可以帮助我解释一下发生了什么吗?非常感谢你

PD我没有为可读性问题提供一些代码,而且我很容易达到限制字符,如果有人需要观看,请告诉我。

1 个答案:

答案 0 :(得分:2)

好的,我已经解决了我的问题。在endpoints.xml文件中声明了一个带有id的ws,我已经用@Service注释声明了实现ws文件,所以我现在明白这个例外......