Spring Bean配置错误导致HTTP 500

用超级用户能成功登录系统,用普通账号在登录系统跳转到错误处理页面,检查后台却没有任何错误。百思不得其解。怀疑问题可能是如下2个原因造成的:

  1. 普通账号没有相关的权限?
  2. Spring Security的配置不正确

   经过详细检查后,排除了上面的两个原因。系统在web.xml里配置了如下的错误处理页面:

 1   <error-page>
2 <error-code>400</error-code>
3 <location>/login/exception.jsp</location>
4 </error-page>
5 <error-page>
6 <error-code>403</error-code>
7 <location>/login/exception.jsp</location>
8 </error-page>
9 <error-page>
10 <error-code>404</error-code>
11 <location>/login/login.jsp</location>
12 </error-page>
13 <error-page>
14 <error-code>500</error-code>
15 <location>/login/exception.jsp</location>
16 </error-page>

  为了显示出系统的详细错误信息,我们暂时将如上的部分去掉了,重启服务器,再次登录,错误堆栈被完整的显示出来了,原来是spring在创建一个bean的时候,找不到属性的access method报错了,导致HTTP 500错误。

  回过头来看,为什么超级管理员就能登录呢?是因为超级管理员登录时,系统会自动跳转到管理页面,与普通账号登录后触发的系统逻辑不一样,Spring在这个时候并没有创建我们上面提到的Bean。

  为什么Spring创建的bean报错时,后台没有错误呢?我们的log error日志已经打开。猜测可能的原因是Spring在创建bean错误的时候并没有将这个错误信息输出到控制台。这个有待验证。 那么能否获取到这个错误堆栈信息,然后展现在我们的错误处理页面呢?这个也有待验证。

 

从这个例子可以看出:

1. 在开发阶段,有可能出现配置错误或程序错误的时候,我们应该去掉错误处理页面映射,让错误信息原形毕露。

2. Spring并不是在Context loader加载的时候会创建bean,在初始化Context loader的时候,Spring会做一些校验,加载Class, 但并不会创建bean,这个可以在某个bean的构造函数里加一段输出来验证。 
 

posted @ 2012-02-12 11:53  先行而后三思  阅读(919)  评论(0编辑  收藏  举报