如何在filter中使用String的IOC

王者_来归 2014-11-13 12:17:17
如题,需求描述如下:
在filter中把用户点击的URL、IP、cookie、时间等信息获取出来,保存到数据库,用于分析哪个url使用的最多,同时也作为一个系统日志。
问题:
获取到信息后,要在filter中使用String的注解bean,然后把数据保存。但是,根据系统启动时加载顺序:listener >> filter >> servlet >> spring,在filter加载的时候,spring中的bean还没有加载,这就导致我在filter中使用bean时,bean为null。

在网上找了几种办法,试了都不行:
方法一:

WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
this.baseDao = (ITestDao<Test>)webApplicationContext.getBean("testDao");

其中,ITestDao为接口类,在实现类中有一个注解:@Component("testDao")
这种方式报错信息如下:
org.hibernate.HibernateException: No Session found for current thread


方法二:
web.xml中:

<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

请各位给点化一下,谢谢!
...全文
246 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
王者_来归 2014-11-17
  • 打赏
  • 举报
回复
jsp的调用不一定都在action里面,比如首页index.jsp。
百里马 2014-11-14
  • 打赏
  • 举报
回复
引用 10 楼 sen_linzhiwang 的回复:
[quote=引用 8 楼 u012345283 的回复:] [quote=引用 7 楼 sen_linzhiwang 的回复:] [quote=引用 6 楼 u012345283 的回复:] [quote=引用 5 楼 sen_linzhiwang 的回复:] [quote=引用 4 楼 u012345283 的回复:] 你filter的init方法就会去操作数据库?
我没有在init方法中去做,我在doFilter中操作的。[/quote] doFilter的话和你服务器启动加载有什么关系?[/quote] 你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗? 执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。[/quote] 是的~你可以用Interceptor来做[/quote] 拦截器实现不了这种方式吧?拦截器只能拦截action,我这里需要获取用户所有的点击内容,不管是action还是jsp。有可能是我对拦截器了解不深吧,其实之前我也想用它,但是想到action很多,而且要实现的话,代码量比使用filter大。[/quote] 当然可以,你jsp的调用不是在action里吗? 代码量怎么会变大?和你的action多少有什么关系?
王者_来归 2014-11-14
  • 打赏
  • 举报
回复
引用 8 楼 u012345283 的回复:
[quote=引用 7 楼 sen_linzhiwang 的回复:] [quote=引用 6 楼 u012345283 的回复:] [quote=引用 5 楼 sen_linzhiwang 的回复:] [quote=引用 4 楼 u012345283 的回复:] 你filter的init方法就会去操作数据库?
我没有在init方法中去做,我在doFilter中操作的。[/quote] doFilter的话和你服务器启动加载有什么关系?[/quote] 你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗? 执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。[/quote] 是的~你可以用Interceptor来做[/quote] 拦截器实现不了这种方式吧?拦截器只能拦截action,我这里需要获取用户所有的点击内容,不管是action还是jsp。有可能是我对拦截器了解不深吧,其实之前我也想用它,但是想到action很多,而且要实现的话,代码量比使用filter大。
王者_来归 2014-11-14
  • 打赏
  • 举报
回复
引用 8 楼 u012345283 的回复:
[quote=引用 7 楼 sen_linzhiwang 的回复:] [quote=引用 6 楼 u012345283 的回复:] [quote=引用 5 楼 sen_linzhiwang 的回复:] [quote=引用 4 楼 u012345283 的回复:] 你filter的init方法就会去操作数据库?
我没有在init方法中去做,我在doFilter中操作的。[/quote] doFilter的话和你服务器启动加载有什么关系?[/quote] 你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗? 执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。[/quote] 是的~你可以用Interceptor来做[/quote] 哦,我没有用过这个,我试一下
百里马 2014-11-14
  • 打赏
  • 举报
回复
引用 7 楼 sen_linzhiwang 的回复:
[quote=引用 6 楼 u012345283 的回复:] [quote=引用 5 楼 sen_linzhiwang 的回复:] [quote=引用 4 楼 u012345283 的回复:] 你filter的init方法就会去操作数据库?
我没有在init方法中去做,我在doFilter中操作的。[/quote] doFilter的话和你服务器启动加载有什么关系?[/quote] 你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗? 执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。[/quote] 是的~你可以用Interceptor来做
王者_来归 2014-11-13
  • 打赏
  • 举报
回复
引用 6 楼 u012345283 的回复:
[quote=引用 5 楼 sen_linzhiwang 的回复:] [quote=引用 4 楼 u012345283 的回复:] 你filter的init方法就会去操作数据库?
我没有在init方法中去做,我在doFilter中操作的。[/quote] doFilter的话和你服务器启动加载有什么关系?[/quote] 你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗? 执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。
百里马 2014-11-13
  • 打赏
  • 举报
回复
引用 5 楼 sen_linzhiwang 的回复:
[quote=引用 4 楼 u012345283 的回复:] 你filter的init方法就会去操作数据库?
我没有在init方法中去做,我在doFilter中操作的。[/quote] doFilter的话和你服务器启动加载有什么关系?
王者_来归 2014-11-13
  • 打赏
  • 举报
回复
引用 4 楼 u012345283 的回复:
你filter的init方法就会去操作数据库?
我没有在init方法中去做,我在doFilter中操作的。
百里马 2014-11-13
  • 打赏
  • 举报
回复
你filter的init方法就会去操作数据库?
王者_来归 2014-11-13
  • 打赏
  • 举报
回复
引用 1 楼 whos2002110 的回复:
就用第一种方法, 不要直接调用dao, 调用service, 一般项目中service层会切入事务,会开启session. 不然就加个OpenSessionInViewFilter 具体作用自己百度一下, 加在你这拦截filter之前.
非常感谢,使用你的方法,确实解决了问题,但是加了opensessionInView后,性能有所降低。但也没有办法,先暂时这样吧。 非常感谢
猎魔人-不纯 2014-11-13
  • 打赏
  • 举报
回复
spring不是监听器的时候初始化容器么,报这种错误应该是没加事务吧,楼上说的对,用service,一般事务都加在service层了
whos2002110 2014-11-13
  • 打赏
  • 举报
回复
就用第一种方法, 不要直接调用dao, 调用service, 一般项目中service层会切入事务,会开启session. 不然就加个OpenSessionInViewFilter 具体作用自己百度一下, 加在你这拦截filter之前.

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧