2014-03-28 33 views
0

在我的應用程序中,我在應用程序中使用Hibernate4實現多租戶實施,我在Tomcat的catalina中遇到了以下錯誤。如何解決在Hibernate4中使用ServletContext資源中定義的名稱'sessionFactory'創建bean的錯誤

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: 
protected org.hibernate.SessionFactory com.boxco.blip.dao.BaseDao.sessionFactory; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext-persistence.xml]: 
Invocation of init method failed; nested exception is java.lang.NullPointerException 

這裏是我的應用程序-persistance.xml

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

<context:annotation-config /> 
<tx:annotation-driven /> 
<context:component-scan base-package="com.boxco.blip"> 
</context:component-scan> 

<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>jdbc/blip</value> 
    </property> 
    <property name="resourceRef"> 
     <value>true</value> 
    </property> 
</bean> 


<!-- Hibernate Session Factory --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="annotatedClasses"> 
     <list> 
    <value>com.boxco.blip.model.Address</value> 
     </list> 
    </property> 
    <property name="hibernateProperties">   
     <map> 
      <entry key="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
      <entry key="hibernate.hbm2ddl.auto" value="validate" /> 
      <entry key="hibernate.show_sql" value="true" /> 
      <entry key="hibernate.connection.autocommit" value="false" /> 
      <entry key="hibernate.jdbc.batch_size" value="0" /> 
      <entry key="hibernate.connection.release_mode" value="after_transaction" /> 
      <entry key="hibernate.multiTenancy" value="SCHEMA" /> 
      <entry key="hibernate.tenant_identifier_resolver" value-ref="multiTenantIdentifierResolver1" /> 
      <entry key="hibernate.multi_tenant_connection_provider" value-ref="multiTenantConnectionProvider1" />  
     </map> 
    </property> 
</bean> 

<bean id="multiTenantConnectionProvider1" class="com.boxco.blip.web.util.SchemaMultiTenantConnectionProviderBlip"> 
    <property name="dataSource" ref="dataSource"/> 
    </bean> 
<bean id="multiTenantIdentifierResolver1" class="com.boxco.blip.web.util.SchemaCurrentTenantIdentifierResolverBlip" /> 

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean>  

MY AddressDao.java文件

package com.boxco.blip.dao; 

import com.boxco.blip.model.Address; 

public interface AddressDao { 
    public Address getAddressByAddressId(int addressId); 
} 

我AddressDaoImpl.java文件

package com.boxco.blip.dao; 

import org.apache.log4j.Logger; 
import org.hibernate.Criteria; 
import org.hibernate.criterion.Restrictions; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Repository; 

import com.boxco.blip.model.Address; 
@Component 
@Repository(value = "addressDao") 

public class AddressDaoImpl extends BaseDao implements AddressDao { 
private static final Logger logger = Logger.getLogger(AddressDaoImpl.class); 

    @Override 
public Address getAddressByAddressId(int addressId) { 
    logger.info("Entering getAddressByAddressId()........"); 
    Address address = null; 
    Criteria criteria = getSession().createCriteria(Address.class); 
    criteria.add(Restrictions.eq("addressId", addressId)); 
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
    address = (Address)criteria.uniqueResult(); 
    logger.info("Exiting getAddressByAddressId().........."); 
    return address; 
} 

}

我的基本道文件,其中i初始化SessionFactory對象:其中,增加

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

<mvc:annotation-driven/> 

<context:component-scan base-package="com.boxco"> 
    <!-- <context:exclude-filter type="regex" expression="com.boxco.blip.dao.*" /> --> 
</context:component-scan> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> 
    <property name="basenames" value="views"/> 

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <value>messages,error_codes</value> 
    </property> 
</bean> 

<bean id="validatorFactory" 
     class="org.springmodules.validation.commons.DefaultValidatorFactory"> 
    <property name="validationConfigLocations"> 
     <list> 
      <value>/WEB-INF/validator-rules.xml</value> 
      <value>/WEB-INF/validator.xml</value> 
      <value>/WEB-INF/validatorFas.xml</value> 
      <value>/WEB-INF/validatorFas-rules.xml</value> 
     </list> 
    </property> 
</bean> 

<bean id="validator" class="org.springmodules.validation.commons.DefaultBeanValidator"> 
    <property name="validatorFactory" ref="validatorFactory"/> 
</bean>  

錯誤是我SessionFactory初始化,但它爲什麼沒有得到

package com.boxco.blip.dao; 

import java.sql.SQLException; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Set; 

import org.hibernate.Criteria; 
import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.criterion.Restrictions; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.orm.hibernate3.HibernateTemplate; 

import com.mysql.jdbc.Connection; 

public abstract class BaseDao 
{ 

@Autowired 
@Qualifier("sessionFactory") 
protected SessionFactory sessionFactory; 

protected void init(SessionFactory factory) { 
    try { 
     setSessionFactory(factory); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

public SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 

public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
} 

public Session getSession() throws HibernateException { 
    // return sessionFactory.getCurrentSession(); 
    return sessionFactory.withOptions().tenantIdentifier("BLIP1314ERP") 
      .openSession(); 
} 

    //some more methods 
    } 

我的調度員-servlet.xml文件init是我的問題..? (我正在處理這個錯誤的第一次)..

任何建議讚賞。

+0

HTTP的可能的複製的最新版本的工作:// stackoverflow.com/q/9508408/1686330 –

+0

@Dirk Lachowski我已經重申了這個鏈接,並在我的.xml文件中添加了org.springframework.orm.hibernate4.LocalSessionFactoryBean&

+1

您能告訴我們完整的NullPointerException的堆棧跟蹤? –

回答

1

它不應該是你的解決方案,無論如何@ @ repository的@component註解是無用的。要麼插入@repository(更適合異常轉換)或@component。

0

我解決它由4.3.4更換我的JAR文件到4.1.7(降級我的罐子)冬眠的版本,我不知道爲什麼它不與Hibernate

相關問題