今天在写一个新的ssh项目的时候,遇到了failed to lazily initialize a collection of role: com.crm.domain.Customer.linkmans, could not initialize proxy - no Session异常,
一开始从前半部分字面意思上理解,似乎是延迟加载出了问题,但是我的类和映射文件是hibernate生成工具自动生成的,出问题的概率非常小,检查了一遍,没什么头绪。
然后关于后半段no Session问题,我已经在web.xml中配置了openSessionInView过滤器:
<!-- struts2的前端控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- OpenSessionInView,解决延迟加载session在web层不可用的问题
将session的生命周期延长到和request一致
-->
<filter>
<filter-name>OpenSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这个filter的作用就是延长hibernate的session生命周期,所以也不应该出现问题。于是找了很久的bug。
最后才发现,这个filter的位置出了问题,一定要放在struts2的StrutsPrepareAndExecuteFilter之前,才能起到作用,像这样:
<!-- opennSessionInView过滤器 -->
<filter>
<filter-name>OpenSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- struts2的前端控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
终于解决了这个bug,不在报异常了。
所以大家配置配置文件的时候一定要小心细节。