springmvc使用注意事项来自于Insight ,仅作记录:
...
1、springmvc 对于静态文件的处理:
如果DispatcherServlet配置的url-pattern = /*,那么需要对web应用中的静态文件请求需要单独配置,两种方式:
a.配置<mvc:default-servlet-handler />
b.或者配置<mvc:resources location="/static/" mapping="/static/**" /> Insight
上述的a方式会注册SimpleUrlHandlerMapping
loop-up 处理请求的handler 时会遍历DispatcherServlet.handlerMappings,遍历的handlerMappings中,SimpleUrlHandlerMapping肯定是最后匹配,决定顺序是在DispatcherServlet初始化handlerMappings时,对容器中所有的HandleMapping.class 进行sort操作,排序的依据是bean.order。
...
2、springmvc 请求出现的400 bad request
如果controller 方法中使用PathVariable RequestBody RequestParam CookieValue 等注解,很有可能会400。
出错原因是:根据request-path 确实找到了对应的handler,但是在解析入参,构造HandlerMethod参数时发生Exception,由DispatcherServlet catch异常并返回。并不会运行到method.invoke,因此加断点是无效的,也看不到异常的栈信息,所以刚开始使用很难调试。
参考:HandlerMethodArgumentResolver ,不同类型的method parameters 委托给对应的解析器实现
需要注意的是:
controller 方法参数类型尽量不要使用原始类型,减少诸如400这样的情况出现。
// 编写controller 注意
private Object handleNullValue(String name, Object value, Class
paramType) {
if (value == null) {
if (Boolean.TYPE.equals(paramType)) {
return Boolean.FALSE;
}
else if (paramType.isPrimitive()) {
throw new IllegalStateException("Optional " + paramType + " parameter '" + name +
"' is present but cannot be translated into a null value due to being declared as a " +
"primitive type. Consider declaring it as object wrapper for the corresponding primitive type.");
}
}
return value;
}