GVKun编程网logo

使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?(使用--help可列出可能的选项)

5

对于使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解使用--help可列

对于使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解使用--help可列出可能的选项,并且为您提供关于java – 具有@Transactional注释的Spring OpenSessionInViewFilter、java – 在OpenSessionInViewFilter之后没有定义名为’sessionFactory’的bean、jfinal SessionInViewInterceptor拦截器为什么获取不到session?、opensessioninview 过滤器解决懒加载问题的宝贵知识。

本文目录一览:

使用哪一个:OpenSessionInViewInterceptor或OpenSessionInViewFilter?(使用--help可列出可能的选项)

使用哪一个: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

java – 具有@Transactional注释的Spring OpenSessionInViewFilter

这是关于 Spring OpenSessionInViewFilter在服务层使用@Transactional注释.

我经历了这么多堆栈溢出帖子,但仍然困惑我是否应该使用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是一个servlet过滤器,而不仅仅是打开一个hibernate会话,并将其存储在为服务请求的线程的SessionHolder中.打开此会话后,当您在请求的呈现阶段使用这个时,hibernate可以读取Lazy初始化的集合和对象.调用SessionFactory.getCurrentSession()时,可以访问此会话.

但是,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

java – 在OpenSessionInViewFilter之后没有定义名为’sessionFactory’的bean

好吧,因为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-/> 

    <!-- 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?

@JFinal 你好,想跟你请教个问题:

我使用全局拦截器SessionInViewInterceptor,希望将session传到freemarker页面上,

/**
 * 配置全局拦截器
 */
public void configInterceptor(Interceptors me) {
        me.add(new SessionInViewInterceptor());
        me.add(new CommonInterceptor());
}

但是页面始终获取不到session,于是我跟踪了一下代码,发现:

导致页面无法获取session,真是奇怪啊,不知道问题出在哪里,

希望各位大侠帮忙指导下,谢谢啦!


opensessioninview 过滤器解决懒加载问题

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 过滤器解决懒加载问题的相关知识,请在本站搜索。

本文标签: