好吧,因为LazyInitializationException我需要在我的web.xml中添加“OpenSessionViewInFilter”,使用以下代码:
- <!-- openSessionInViewfilter -->
- <filter>
- <filter-name>openSessionInViewFilter</filter-name>
- <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>openSessionInViewFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
问题是在我添加此代码后,当我尝试启动TOMCAT 7时出现以下错误:
- org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory' is defined
- at org.springframework.beans.factory.support.DefaultListablebeanfactory.getBeanDefinition(DefaultListablebeanfactory.java:529)
- at org.springframework.beans.factory.support.Abstractbeanfactory.getMergedLocalBeanDefinition(Abstractbeanfactory.java:1094)
- at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:276)
- at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:196)
- at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079)
- at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:242)
- at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:227)
- at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:171)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
- at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
- at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
- at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
- at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
- at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
- at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
- at java.lang.Thread.run(Thread.java:724)
我不知道为什么会出现这种错误,因为我使用的是Entitymanager(JPA)而不是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:context="http://www.springframework.org/schema/context"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
- <!-- Seta anotaçoes para serem usadas pelo Spring -->
- <context:annotation-config />
- <!-- Define o pacote onde o Spring vai procurar por beans anotados -->
- <context:component-scan
- base-package="br.com.sender" />
- <!-- define que as transaçoes irao ser anotadas -->
- <tx:annotation-driven proxy-target-class="true" />
- <!-- Configuracao do Banco de Dados -->
- <bean id="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="org.postgresql.Driver" />
- <property name="url" value="jdbc:postgresql://localhost/sender" />
- <property name="username" value="postgres" />
- <property name="password" value="pgadmin" />
- </bean>
- <!-- Configuracao do Hibernate -->
- <bean id="entityManagerFactory"
- class="org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean">
- <property name="persistenceUnitName" value="senderPU" />
- <property name="dataSource" ref="dataSource" />
- <property name="jpaVendorAdapter">
- <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
- <property name="databasePlatform" value="org.hibernate.dialect.PostgresqlDialect" />
- <property name="showsql" value="true" />
- </bean>
- </property>
- </bean>
- <!-- Configuracao do gerente de transacoes do Spring -->
- <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
- <property name="entityManagerFactory" ref="entityManagerFactory" />
- </bean>
- </beans>
解决方法
您需要在下面添加两个代码段
- <filter>
- <filter-name>OpenEntityManagerInViewFilter</filter-name>
- <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
- </filter>
和
- <filter-mapping>
- <filter-name>OpenEntityManagerInViewFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
然后你需要在你的类路径中添加spring-orm- {我们的版本} .jar.如果你使用maven就像这样
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-orm</artifactId>
- <version>${spring.ver}</version>
- </dependency>
– 编辑 –
对不起,我正在使用JPA,你的代码建议你使用hibernate3,所以你的filter-class应该是org.springframework.orm.hibernate3.support.OpenSessionInViewFilter