2012-03-29 45 views
0

下午好,我有一個基於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當前正在創建:是否存在無法解析的循環引用?關於BeanCurrentlyInCreationException,無法解析的循環引用

這是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中

這是執行en d點的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 
} 

正如你可以看到,這個服務已經inyected稱爲servicioPersistenciaUsuarios持久的服務,基本上使用DAO標記爲@Repository 。

這是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有另一個dependencie,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 
} 
總之

,當春嘗試實例的問題發生端點實現文件storeService並不理解它,因爲我沒有任何文件中的類型化構造函數,getter和setter我有他在任何依賴關係之上都是對立的。有人可以幫我解釋發生了什麼嗎?非常感謝你

PD我沒有提出可讀性問題的一些代碼,我很容易達到限制字符,如果有人需要觀看,讓我知道。

回答

2

好的,我已經解決了我的問題。在endpoints.xml文件裏面聲明瞭我的ws和一個id,並且我已經聲明瞭具有@Service註釋的實現ws文件,所以現在清除了異常...