2012-08-28 134 views
4

我想用JSF 2.0 + Hibernate 4和Spring 3.1安裝一個Web應用程序。當我測試我的Dao方法時,出現以下異常。JSF 2.0,Spring 3.1和Hibernate 4.0集成

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'empDaoImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.springHibernate.dao.EmpDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Error applying BeanValidation relational constraints 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at com.springHibernate.test.TestEmployee.main(TestEmployee.java:15) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.springHibernate.dao.EmpDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Error applying BeanValidation relational constraints 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:506) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284) 
    ... 13 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Error applying BeanValidation relational constraints 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:848) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:790) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) 
    ... 15 more 
Caused by: org.hibernate.HibernateException: Error applying BeanValidation relational constraints 
    at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:219) 
    at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:126) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:295) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1726) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1764) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) 
    ... 25 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:208) 
    ... 33 more 
Caused by: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 
    at org.hibernate.validator.util.LoggerFactory.make(LoggerFactory.java:29) 
    at org.hibernate.validator.util.Version.<clinit>(Version.java:24) 
    at org.hibernate.validator.engine.ConfigurationImpl.<clinit>(ConfigurationImpl.java:59) 
    at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:41) 
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:269) 
    at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111) 
    at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:521) 
    at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyDDL(TypeSafeActivator.java:119) 
    ... 38 more 

下面是我的代碼

Employee.java

package com.springHibernate.model; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="employee") 
public class Employee { 
    @Id 
    @Column(name="EmpID") 
    private int empID; 

    @Column(name="EmpName") 
    private String empName; 

    @Column(name="Email") 
    private String email; 

    public int getEmpID() { 
     return empID; 
    } 

    public void setEmpID(int empID) { 
     this.empID = empID; 
    } 

    public String getEmpName() { 
     return empName; 
    } 

    public void setEmpName(String empName) { 
     this.empName = empName; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

EmployeeDao.java

package com.springHibernate.dao; 

import java.util.List; 

import com.springHibernate.model.Employee; 

public interface EmpDao { 

    public List<Employee> getAllEmployees(); 

} 

EmployeeDaoImpl.java

package com.springHibernate.dao; 

import java.util.List; 

import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 

import com.springHibernate.model.Employee; 

@Repository("empDaoImpl") 
public class EmpDaoImpl implements EmpDao{ 



    @Autowired 
    private SessionFactory sessionFactory; 

    public SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

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

    @SuppressWarnings("unchecked") 
    @Override 
    public List<Employee> getAllEmployees() { 
     return sessionFactory.getCurrentSession().createQuery(" from Employee").list(); 
    } 


} 

EmpService.java

package com.springHibernate.service; 

import java.util.List; 

import com.springHibernate.model.Employee; 

public interface EmpService { 

    public List<Employee> getAllEmployees(); 

} 

EmpServiceImpl.java

package com.springHibernate.service; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.springHibernate.dao.EmpDao; 
import com.springHibernate.model.Employee; 


@Service("empServiceImpl") 
public class EmpServiceImpl implements EmpService { 
    @Autowired 
    EmpDao empDao; 

    public EmpDao getEmpDao() { 
     return empDao; 
    } 

    public void setEmpDao(EmpDao empDao) { 
     this.empDao = empDao; 
    } 

    @Transactional(readOnly = true) 
    public List<Employee> getAllEmployees() { 
     return empDao.getAllEmployees(); 
    } 

} 

EmployeeBean.java

package com.springHibernate.managedBeans; 

import java.util.ArrayList; 
import java.util.List; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.RequestScoped; 

import org.springframework.beans.factory.annotation.Autowired; 

import com.springHibernate.model.Employee; 
import com.springHibernate.service.EmpService; 

@ManagedBean(name = "empBean") 
@RequestScoped 
public class EmployeeBean { 

    @ManagedProperty(value = "#{EmpServiceImpl}") 
    EmpService empService; 

    List<Employee> empList; 

    private int empID; 
    private String empName; 
    private String email; 

    public EmpService getEmpService() { 
     return empService; 
    } 

    public void setEmpService(EmpService empService) { 
     this.empService = empService; 
    } 

    public List<Employee> getEmpList() { 
     empList = new ArrayList<Employee>(); 
     empList.addAll(getEmpService().getAllEmployees()); 
     return empList; 
    } 

    public void setEmpList(List<Employee> empList) { 
     this.empList = empList; 
    } 

    public int getEmpID() { 
     return empID; 
    } 

    public void setEmpID(int empID) { 
     this.empID = empID; 
    } 

    public String getEmpName() { 
     return empName; 
    } 

    public void setEmpName(String empName) { 
     this.empName = empName; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

的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:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         http://www.springframework.org/schema/tx 
         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="com.springHibernate.dao,com.springHibernate.managedBeans,com.springHibernate.service,com.springHibernate.model" /> 
    <context:annotation-config /> 

    <bean id="Employee" class="com.springHibernate.model.Employee" /> 

    <bean id="EmpService" class="com.springHibernate.service.EmpServiceImpl"> 
     <property name="empDao" ref="EmpDao"/> 
    </bean> 

    <bean id="EmpDao" class="com.springHibernate.dao.EmpDaoImpl"> 
     <property name="sessionFactory" ref="SessionFactory"></property> 
    </bean> 


    <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/test" /> 
     <property name="username" value="root" /> 
     <property name="password" value="ASSET" /> 
    </bean> 


    <bean id="SessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="DataSource" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 


    <tx:annotation-driven transaction-manager="txManager" /> 



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

</beans> 

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 

    <display-name>SpringHibernate</display-name> 

    <context-param> 
    <param-name>javax.faces.CONFIG_FILES</param-name> 
    <param-value>/WEB-INF/faces-config.xml</param-value> 
    </context-param> 
    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 
    <context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
    </context-param> 
    <welcome-file-list> 
    <welcome-file>/pages/index.xhtml</welcome-file> 
    </welcome-file-list> 
    <servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.faces</url-pattern> 
    </servlet-mapping> 
    <context-param> 
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
    </context-param> 
    <context-param> 
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
    <param-value>resources.application</param-value> 
    </context-param> 
    <listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 

</web-app> 

faces-config.xml中

<?xml version="1.0"?> 
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> 

    <application> 
     <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
    </application> 
</faces-config> 

識別TestClass

package com.springHibernate.test; 

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

import com.springHibernate.model.Employee; 
import com.springHibernate.service.EmpService; 

public class TestEmployee { 

    public static void main(String[] args) { 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 

     EmpService empService = (EmpService)ctx.getBean("empServiceImpl"); 

     List<Employee> l1 = new ArrayList<Employee>(); 

     l1 = empService.getAllEmployees(); 

     for (Employee e1 : l1) 
      System.out.println("Employee Name: "+e1.getEmpName()); 
    } 

} 

我正在嘗試使用註釋。 Slf4j已經存在於lib文件夾中。請查看代碼並幫助我設置項目。

+0

似乎你缺少一些罐子。你應該使用像maven這樣的依賴關係管理器來處理你的依賴關係。請張貼您的罐子清單。 – erencan

+0

嗨erencan,謝謝你的回覆。其實所有的罐子都存在於我的lib文件夾中。問題是我忘了將annotatedClass屬性添加到sessionFactory。所以,它無法創建bean和依賴關係。 – neni

回答

3

這是修改後的工作applicationContext.xml。我忘了將annotatedClass屬性添加到sessionFactory中。

的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:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         http://www.springframework.org/schema/tx 
         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="com.springHibernate" /> 
    <context:annotation-config /> 

    <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/test" /> 
     <property name="username" value="root" /> 
     <property name="password" value="ASSET" /> 
    </bean> 


    <bean id="SessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="DataSource" /> 

     <property name="annotatedClasses"> 
     <list> 
      <value>com.springHibernate.model.Employee</value> 
     </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 


    <tx:annotation-driven transaction-manager="txManager" /> 

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

</beans> 
+0

如果這是最初問題的解決方案,請將您的問題標記爲已回答 – tasel

+0

我現在不能標記它。 2天后我可以做到這一點:) – neni