随笔 - 81  文章 - 1033  trackbacks - 0
<2007年2月>
28293031123
45678910
11121314151617
18192021222324
25262728123
45678910

在浮躁的年代里,我们进取心太切,患得患失;虚荣心太强,战战兢兢。一心争强好胜,惟恐榜上无名。
I think I can fly , and flying like a bird !
程序员一名,已售出,缺货中!

我的邮件联系方式

用且仅用于MSN

博客点击率
free web counter
free web counter

常用链接

留言簿(36)

随笔档案

搜索

  •  

积分与排名

  • 积分 - 186213
  • 排名 - 309

最新评论

阅读排行榜

评论排行榜

    在Spring2.0中除了以前的Singleton和Prototype外又加入了三个新的web作用域,分别为request、session和global session,它们的含义和用法请大家参考Spring官方手册的相关章节。如果你想让你的容器里的某个bean拥有其中某种新的web作用域,除了在bean级上配置相应的scope属性,还必须在容器级做一个额外的初始化配置。即在web应用的XML声明文件web.xml中增加下述ContextListener

1 <web-app>
2   
3   <listener>
4     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
5   </listener>
6   
7 </web-app>

    如果你用的是早期版本的web容器(Servlet 2.4以前),那么你要使用一个javax.servlet.Filter的实现。


 1 <web-app>
 2   ..
 3   <filter> 
 4     <filter-name>requestContextFilter</filter-name> 
 5     <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
 6   </filter> 
 7   <filter-mapping> 
 8     <filter-name>requestContextFilter</filter-name> 
 9     <url-pattern>/*</url-pattern>
10   </filter-mapping>
11   
12 </web-app>

    两种方式完成完全一样的功能:基于LocalThread将HTTP request对象绑定到为该请求提供服务的线程上。这使得具有request和session作用域的bean能够在后面的调用链中被访问到。

    我一直使用的是Filter的配置方式,虽然使用的web容器Resin3.0.19是支持servlet2.4的但也懒得改为更为简洁的Listener了。使用一切正常,昨日无聊翻阅Spring的手册无意中又看到这一节,想想自己也太懒了,几句话就改了为什么不更简单呢?于是就把配置改成了Listener的方式,启动一切正常,但当请求第一个链接时居然报错了!

 1 java.lang.NullPointerException
 2     at org.springframework.web.context.request.RequestContextListener.requestDestroyed(RequestContextListener.java:67)
 3     at com.caucho.server.webapp.DispatchFilterChain.doFilter(DispatchFilterChain.java:120)
 4     at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
 5     at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:277)
 6     at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:106)
 7     at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
 8     at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
 9     at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
10     at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
11     at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
12     at javax.servlet.http.HttpServlet.service(HttpServlet.java:115)
13     at javax.servlet.http.HttpServlet.service(HttpServlet.java:92)
14     at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:106)
15     at org.extremecomponents.table.filter.AbstractExportFilter.doFilter(AbstractExportFilter.java:49)
16     at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
17     at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:173)
18     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
19     at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
20     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:78)
21     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
22     at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
23     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
24     at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
25     at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
26     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
27     at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
28     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
29     at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
30     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
31     at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
32     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
33     at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
34     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
35     at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:217)
36     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
37     at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:106)
38     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
39     at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:229)
40     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
41     at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)
42     at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
43     at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
44     at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:178)
45     at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
46     at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
47     at com.caucho.server.port.TcpConnection.run(TcpConnection.java:389)
48     at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:507)
49     at com.caucho.util.ThreadPool.run(ThreadPool.java:433)
50     at java.lang.Thread.run(Thread.java:595)
51 [10:01:26.109] java.lang.NullPointerException
52 [10:01:26.109]     at org.springframework.web.context.request.RequestContextListener.requestDestroyed(RequestContextListener.java:67)
53 [10:01:26.109]     at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:188)
54 [10:01:26.109]     at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
55 [10:01:26.109]     at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
56 [10:01:26.109]     at com.caucho.server.port.TcpConnection.run(TcpConnection.java:389)
57 [10:01:26.109]     at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:507)
58 [10:01:26.109]     at com.caucho.util.ThreadPool.run(ThreadPool.java:433)
59 [10:01:26.109]     at java.lang.Thread.run(Thread.java:595)

    顺便说一下,用Listenter方式配置初始化ApplicationContext的ContextLoaderListener是正常的,它也是需要servlet2.4支持的,所以应该不是因为容器支持的servlet版本问题。  

    换回Filter后一切正常,看了一下Spring源码也没看除个所以然,在网上找了很久也没找到答案,很是郁闷!希望路过的高人们能够不吝赐教,感激涕零!

posted on 2007-02-08 10:10 cresposhi 阅读(5522) 评论(20)  编辑  收藏

FeedBack:
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 11:26 GoKu
都说Resin速度比Tomcat快,为什么用Resin的人比较少...  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 11:29 施伟
教科书上讲的都是tomcat,大家都是从那个阶段过来的,然后中国的教育从小到大都是这样,都不怎么喜欢尝试新的东西,喜欢照书做。不过话说回来,tomcat谁做的,apache啊,牛啊,让人放心!  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 12:04 梅颖
插不上嘴了。。。唉  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 13:11 BeanSoft
哈,因为自己blog写的牢骚贴说了几句框架的坏话, 就有人留言说:
ALin
Posted @ 2007-02-08 09:56
从此以后不再读这个Blog里面的任何文章……
见: Java 这么多框架, 前途在何方?
http://www.blogjava.net/beansoft/archive/2007/02/03/97774.html

Resin(有Open Source版本和商业版, 像 Mysql 那样) 启动的确比 Tomcat 快, 速度也快, 不过部分地方是不太符合 Tomcat 的惯例(不知道算不算 JSP 规范), 所以有些应用会报错. 最新的Resin 3.0.22 修正了很多不兼容的 bug.

at org.springframework.web.context.request.RequestContextListener.requestDestroyed(RequestContextListener.java:67)

看看这个 Spring 中类的源码是不是取不到 context 什么的.

  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 13:27 BeanSoft
public class RequestContextListener implements ServletRequestListener {

/** Logger available to subclasses */
protected final Log logger = LogFactory.getLog(getClass());


public void requestInitialized(ServletRequestEvent requestEvent) {
//....
}

public void requestDestroyed(ServletRequestEvent requestEvent) {
ServletRequestAttributes requestAttributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
requestAttributes.requestCompleted();
RequestContextHolder.setRequestAttributes(null);
LocaleContextHolder.setLocale(null);
if (logger.isDebugEnabled()) {
logger.debug("Cleared thread-bound request context: " + requestEvent.getServletRequest());
}
}

}

seems requestAttributes 取到的结果是 null, 把这里加个判断修正一下重新编译打包不知道会不会好. 我看的是 2.0.2 的 src.  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 13:39 施伟
这个代码我跟过了。。。 如果就这样判断然后就跳过去我总觉得不过,因为在tomcat里应该是没有问题的 所以这里的对象应该是存在的,如果不找到根本原因 恐怕会有内存泄漏等问题。。。  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 13:47 施伟
@BeanSoft
在你的那篇文章里留了一句话,也在这里发一遍,紧记于心:框架是告诉人们不该去做什么,而不是告诉人们该去做什么;容器是告诉人们该去做什么,而不是告诉人们不该去做什么!
有点绕口,不过味深!  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 13:54 BeanSoft
看到了. 呵呵, 有时候是挺头痛. 不过我想要是把你的问题放到 springside, 应该有人能指点一下吧. Google 一下看看有人遇到过没有.  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 13:58 施伟
昨天晚上google了半天都没找到。。。等会到springside和spring中文站去逛逛,看有没结果,现在只能将就着Filter用着了。。。框架啊框架 呵呵  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 13:59 BeanSoft
开源的没技术支持, API 不稳定, 的确是个大问题. 今天吃饭同事们还聊到 Struts 2.0 简直就跟 1.0 没共同点了快.  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 14:02 施伟
Struts2就是webwork2。。。说是从Struts1过渡过来确实是瞎掰
老项目还不如就用Struts1算了
新的项目再说吧,不过webwork确实比Struts要爽的多,够简单。。。我喜欢。。。  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-08 14:21 梅颖
你这热闹了,不要我了。。。  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-10 21:58 施伟
要啊要啊,谁说不要啊,呵呵!  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-12 12:26 梅颖
呵呵,我们老大都来了的,但是她冒留言,呵呵  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-02-13 09:08 施伟
怎么不留言列?你们老大搞这么深沉搞么事洒,呵呵  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-03-20 15:32 ssmax
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问[未登录] 2007-07-06 09:26 sun
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问 2007-08-14 01:04 farush
我也是遇到同样的问题。
我用的是jetty5.1.12
servlet2.4 (web.xml 头也同样正常声明了使用servlet2.4)
spring2.0.6

我也是使用监听器的方式。

不过我的情况更坏,当使用
org.springframework.web.context.ContextLoaderListener时:
bean的scope为singleton或prototype时,正常,但scope为request或session时,容器在启动就抛出异常。提示建议我使用:
org.springframework.web.context.request.RequestContextListener
于是,我将监听器ContextLoaderListener换成了RequestContextListener,这里容器启动抛新异常,提示WebApplicationContext没初始化,建议我使用ContextLoaderListener,
无奈,两个监听器都加上,
这下两个异常一起抛。。。。。

更奇怪的是,即使bean是singleton,
单单使用
org.springframework.web.context.request.RequestContextListener
这种方式还是启动不了,提示WebApplicationContext没得到初始化。。。

PS:
eclipse3.3
jdk5.0
maven2

很是郁闷,郁闷了几天了,只能暂时不用request和session bean了。。。  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问[未登录] 2008-12-03 16:04 Dragon
@BeanSoft
两者不同了,Struts2 是webwork升级版  回复  更多评论
  
# re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑问[未登录] 2014-08-09 20:14 CC
虽然这么久远了,但我还是回一个,让碰到这个问题的兄弟们别走弯路

程序用spring4.0.5,struts2.3.16.3,listener配置,测试环境tomcat7.0.54上程序正常,生产环境tomcat7.0.52,碰到了楼主一样的问题,最后升级成tomcat7.0.55就没问题了,所以在各种框架满天飞的天下,webserver也要和第三方jar包同步更新,才能抵御随时可能出现的各种不兼容问题  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: