对于使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解使用--help可列
对于使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解使用--help可列出可能的选项,并且为您提供关于java – 具有@Transactional注释的Spring OpenSessionInViewFilter、java – 在OpenSessionInViewFilter之后没有定义名为’sessionFactory’的bean、jfinal SessionInViewInterceptor拦截器为什么获取不到session?、opensessioninview 过滤器解决懒加载问题的宝贵知识。
本文目录一览:- 使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?(使用--help可列出可能的选项)
- java – 具有@Transactional注释的Spring OpenSessionInViewFilter
- java – 在OpenSessionInViewFilter之后没有定义名为’sessionFactory’的bean
- jfinal SessionInViewInterceptor拦截器为什么获取不到session?
- opensessioninview 过滤器解决懒加载问题
使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?(使用--help可列出可能的选项)
我很难决定要使用哪个“ View Open Session”:使用Spring
MVC的拦截器配置OpenSessionInViewInterceptor还是在web.xml的过滤器中配置OpenSessionInViewFilter?根据我的研究,它们几乎可以做同样的事情,但是我试图了解每种类型的区别和用法。
两者之间的最大区别是,对于无法在web.xml中使用过滤器的人(例如Servlet
2.2及更早版本),他们唯一的选择是使用OpenSessionInViewInterceptor。不知何故,我之所以倾向于拦截器,是因为我必须为我的项目创建一个自定义拦截器,所以我考虑将所有这些“过滤器”分组在Spring
MVC配置文件中,而不是在web.xml和我的自定义中包含OpenSessionInViewFilter Spring
MVC配置文件中的拦截器。这实际上是决定使用哪种方法的me脚方法,而我的好奇心使我在这里丧命。
谁能分享您对此的想法?你们使用哪一个?
谢谢。
答案1
小编典典正如您所说,两者大致相同。Spring为他们提供了两者,因此您可以选择最适合您现有应用程序的一种。
如果使用Spring MVC,则使用拦截器是有意义的,因为它更易于配置,并且可以与Spring MVC更好地集成。
但是,如果您不使用Spring
MVC,而仅在业务逻辑级别使用Spring,那么拦截器并不是真正的选择,并且过滤器变得更合适。因为过滤器不是由Spring管理的,所以它们很难配置为与Spring集成,但这是一个折衷方案。
java – 具有@Transactional注释的Spring OpenSessionInViewFilter
我经历了这么多堆栈溢出帖子,但仍然困惑我是否应该使用OpenSessionInViewFilter或不避免LazyInitializationException
如果有人帮我找出以下查询的答案,这将是非常有帮助的.
>在应用程序中使用OpenSessionInViewFilter是不好的做法
具有复杂的模式.
>使用此过滤器可能会导致N 1问题
>如果我们使用OpenSessionInViewFilter是否意味着@Transactional不是必需的?
下面是我的Spring配置文件
<context:component-scan base-package="com.test"/> <context:annotation-config/> <bean id="messageSource"> <property name="basename" value="resources/messages" /> <property name="defaultEncoding" value="UTF-8" /> </bean> <bean id="propertyConfigurer"https://www.jb51.cc/tag/fig/" target="_blank">fig.PropertyPlaceholderConfigurer" p:location="/WEB-INF/jdbc.properties" /> <bean id="dataSource"destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> <bean id="sessionFactory"https://www.jb51.cc/tag/factorybean/" target="_blank">factorybean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> <property name="configurationClass"> <value>org.hibernate.cfg.AnnotationConfiguration</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${jdbc.dialect}</prop> <prop key="hibernate.show_sql">true</prop> <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> --> </props> </property> </bean> <tx:annotation-driven /> <bean id="transactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
解决方法
但是,OpenSessionInView只是打开会话,它不会开始任何事务.打开一个会话后,您可以从数据库中读取对象,但是如果要在事务中执行某些操作,则需要使用@Transactional注释或其他机制来在事务的开始和结束时划分.
那么问题的答案是:
Is it bad practice to use OpenSessionInViewFilter in application having complex schema.
这是一个很好的做法,如果你需要避免LazyInitializationException,并且重载只是打开新的Hibernate Session,并在每个请求的请求结束时关闭它.
Using this filter can cause N+1 problem
我在许多项目中使用这个过滤器,没有任何问题.
if we are using OpenSessionInViewFilter does it mean @Transactional not required?
不,你只有一个Hibernate Session在SessionHolder中打开线程,但是如果你需要事务,你需要put @Transactional.
java – 在OpenSessionInViewFilter之后没有定义名为’sessionFactory’的bean
<!-- 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-/> <!-- Configuracao do Banco de Dados --> <bean id="dataSource"> <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"https://www.jb51.cc/tag/factorybean/" target="_blank">factorybean"> <property name="persistenceUnitName" value="senderPU" /> <property name="dataSource" ref="dataSource" /> <property name="jpavendorAdapter"> <beanhttps://www.jb51.cc/tag/vend/" target="_blank">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"> <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
jfinal SessionInViewInterceptor拦截器为什么获取不到session?
@JFinal 你好,想跟你请教个问题:
我使用全局拦截器SessionInViewInterceptor,希望将session传到freemarker页面上,
/**
* 配置全局拦截器
*/
public void configInterceptor(Interceptors me) {
me.add(new SessionInViewInterceptor());
me.add(new CommonInterceptor());
}
但是页面始终获取不到session,于是我跟踪了一下代码,发现:
导致页面无法获取session,真是奇怪啊,不知道问题出在哪里,
希望各位大侠帮忙指导下,谢谢啦!
opensessioninview 过滤器解决懒加载问题
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
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-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
<!-- default: /WEB-INF/applicationContext.xml -->
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> -->
<param-value>classpath:beans.xml</param-value>
</context-param>
<!-- openSessionInView的过滤器必须放在struts的过滤器之前 -->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
今天关于使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?和使用--help可列出可能的选项的讲解已经结束,谢谢您的阅读,如果想了解更多关于java – 具有@Transactional注释的Spring OpenSessionInViewFilter、java – 在OpenSessionInViewFilter之后没有定义名为’sessionFactory’的bean、jfinal SessionInViewInterceptor拦截器为什么获取不到session?、opensessioninview 过滤器解决懒加载问题的相关知识,请在本站搜索。
本文标签: