跟DefaultAnnotationHandlerMapping
<mvc:annotation-driven>和DefaultAnnotationHandlerMapping
spring配置拦截器有两种方式:
<mvc:annotation-driven /> <!-- *************openSessionInViewInterceptor *************--> <bean id="openSessionInViewInterceptor"class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- **************interceptors ************************** --> <beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> <ref bean="openSessionInViewInterceptor" /> </list> </property> </bean> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/*.htm" /> <bean id="metaInfoInterceptor" class="com.jumbo.web.interceptor.MetaInfoInterceptor"/> </mvc:interceptor> </mvc:interceptors>
如果以上两种方式结合配置,可能会出现问题。
原因为:DefaultAnnotationHandlerMapping 被启动了两遍,controller 被Mapped了两遍。
mvc:annotation-driven 会自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个实例,
这个时候启动的 DefaultAnnotationHandlerMapping,openSessionInViewInterceptor没有起作用,仅在我再次配置的 DefaultAnnotationHandlerMapping才起了作用
而controller 的代码,恰恰是使用了 第一次启动的 DefaultAnnotationHandlerMapping ,导致没有openSessionInViewInterceptor,产生了no session的 异常
转:http://feitianbenyue.iteye.com/blog/1271181
<!--EndFragment--><!--EndFragment-->