如题,需求描述如下: 在网上找了几种办法,试了都不行: WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); this.baseDao = (ITestDao<Test>)webApplicationContext.getBean("testDao"); 其中,ITestDao为接口类,在实现类中有一个注解:@Component(“testDao”) 方法二: <filter> <filter-name>DelegatingFilterProxy</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetBeanName</param-name> <param-value>myFilter</param-value> </init-param> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>DelegatingFilterProxy</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 在application-beans.xml中: <bean id="myFilter" class="com.Test.filter.TestFilter"> <property name="sessionFactory" ref="sessionFactory" /> </bean> 在TestFilter中: this.sessionFactory.getCurrentSession().save(test); 这个也报错,原因为this.sessionFactory.getCurrentSession()为null了。 我使用的是:struts2+hibernate4+spring4 请各位给点化一下,谢谢! |
|
30分 |
就用第一种方法, 不要直接调用dao, 调用service, 一般项目中service层会切入事务,会开启session.
不然就加个OpenSessionInViewFilter 具体作用自己百度一下, 加在你这拦截filter之前. |
5分 |
spring不是监听器的时候初始化容器么,报这种错误应该是没加事务吧,楼上说的对,用service,一般事务都加在service层了
|
非常感谢,使用你的方法,确实解决了问题,但是加了opensessionInView后,性能有所降低。但也没有办法,先暂时这样吧。 |
|
5分 |
你filter的init方法就会去操作数据库?
|
我没有在init方法中去做,我在doFilter中操作的。 |
|
doFilter的话和你服务器启动加载有什么关系? |
|
你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗? |
|
是的~你可以用Interceptor来做 |
|
哦,我没有用过这个,我试一下 |
|
拦截器实现不了这种方式吧?拦截器只能拦截action,我这里需要获取用户所有的点击内容,不管是action还是jsp。有可能是我对拦截器了解不深吧,其实之前我也想用它,但是想到action很多,而且要实现的话,代码量比使用filter大。 |
|
当然可以,你jsp的调用不是在action里吗? |
|
jsp的调用不一定都在action里面,比如首页index.jsp。
|