0
点赞
收藏
分享

微信扫一扫

SpringMvc-HandlerMethodArgumentResolver


该接口并不是责任链模式,也就是说,spring发现一个解析器能解析该参数的时候,spring不会再去调用下一个解析器,所以,这里首先抛出一个问题的答案:如果我想使用自己定义的解析器,应该如何使用呢?答案是应该在Controller的方法中的参数前,加上一个自己定义的独有的注解

使用场景:之前我遇见过,前台传递的数据格式是PHP遵循的数据规范,是这个样子的:​​{"user_name":"hehe"}​​​,因为SpringMVC中只能对驼峰标识(userName)解析,而不能对下划线这种格式解析,所以此处应该自定义参数解析器
1.定义两个实体类

public class User1(){
private String userName;
}
public class User2(){
private String userName;
}

2.定义1个Controller

@Controller
public class MyController{
@RequestMapping("m1")
public void m1(User1 u1,User2 u2){
//注意此处是两个参数
System.out.println(u1.getName());
System.out.println(u2.getName());
}
}

3.自定义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);
解析form表单的是ServletModelAttributeMethodProcessor(true);
解析form/data的是RequestParamMethodArgumentResolver


举报

相关推荐

0 条评论