在jsp里取值时报 session close or no session异常,这是因为实体类中对应的 @ManyToOne @ManyToMany 等用到了fetch = FetchType.LAZY 注解,也是就在程序需要该数值时才进行加载,减少了内存小号和系统资源。但是在jsp里加载数值时该session已经关闭了,所以会报该异常。
仔细看了web.xml配置文件当时的情况是这样的
<filter>
<filter-name>OpenEntityManagerInView</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>dtssEntityManagerFactory</param-value>
</init-param>
</filter>
......省略别的filter
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenEntityManagerInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
......省略别的filter-mapping
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
通过查找资料知道OpenEntityManagerInViewFilter要在struts2的前面 本来以为上面这种写法正确 但是懒加载怎么测都不好用
后来改成这样
<filter>
<filter-name>OpenEntityManagerInView</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>dtssEntityManagerFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenEntityManagerInView</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>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>