在测试 /manage/user/login.do这一URL时,返回服务异常。
- 阶段一
于是看日志
EXCEPTION信息:ResourceHttpRequestHandler cannot be cast to org.springframework.web.method.HandlerMethod,资源处理器不能被转换为方法处理器,定位到拦截器的强转出错,如下图。网上资料说要排除掉静态资源的请求,
但是这个请求URL/manage/user/login.do 不是静态资源,Spring为什么会用静态资源处理器来处理动态请求?
- 阶段二
于是打印出URL,发现请求调用了两次,而且第二次的请求URL从/manage/user/login.do⇒/manage/user/manage/user/login.do,这里就明白了。因为Spring会把定位不到的请求都用静态资源处理器来处理。但为什么请求两次还是不明白。
把拦截器去了仍然调用两次,问题不在拦截器,试了试其他URL的方法的调用,都没有这一个问题。
- 阶段三
经过方法对比,发现报错的方法上没有加@ResponseBody注解。
虽然原因还是不知道,加上该注解之后就对了。网上查@ResponseBody的详细解释,是说会把返回值放到响应体里,这里应该是因为方法的返回值没有被解析为json格式,也没有加入到响应体里,spring把这当作了一次重定向,而且把该url作为相对路径,于是前面加上绝对路径就重复了两遍。
最后建议大家把能加在类上的注解就不要放到方法上了,方法太多容易漏掉。