使用场景:之前我遇见过,前台传递的数据格式是PHP遵循的数据规范,是这个样子的:{“user_name”:“hehe”},因为SpringMVC中只能对驼峰标识(userName)解析,而不能对下划线这种格式解析,所以此处应该自定义参数解析器
1.实体类
public class User1(){
private String userName;
}
public class User2(){
private String userName;
}
2.定义Controller
@Controller
public class MyController{
@RequestMapping("m1")
public void m1(User1 u1,User2 u2){
//注意此处是两个参数
System.out.println(u1.getName());
System.out.println(u2.getName());
}
}
自定义HandlerMethodArgumentResolver
public class MyResolver implements HandlerMethodArgumentResolver {
//此方法会走两次,因为controller里是两个参数,(*^__^*) 嘻嘻
@Override
public boolean supportsParameter(MethodParameter parameter) {
//如果controller里的参数是User1或者是User2类型,就用该参数解析器
return parameter.getParameterType()==User1.class || parameter.getParameterType()==User2.class;
}
//注意该方法返回值,一个Object就是Controller里的一个参数
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
if (parameter.getParameterType() == User1.class) {
User1 u=new User1();
u.setName("呵呵");
return u;
}
if (parameter.getParameterType() == User2.class) {
User2 u=new User2();
u.setName("哈哈");
return u;
}
}
}
4.请求controller,会发现打印出
呵呵
哈哈
注:
解析json的是RequestResponseBodyMethodProcessor(List<HttpMessageConverter>);
解析form表单的是ServletModelAttributeMethodProcessor(true);
解析form/data的是RequestParamMethodArgumentResolver