該接口并不是責任鏈模式,也就是說,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里是兩個參數,(*^__^*) 嘻嘻@Overridepublic boolean supportsParameter(MethodParameter parameter) {//如果controller里的參數是User1或者是User2類型,就用該參數解析器 return parameter.getParameterType()==User1.class || parameter.getParameterType()==User2.class;}//注意該方法返回值,一個Object就是Controller里的一個參數@Overridepublic 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;}}
}
substring java,4.請求controller,會發現打印出
呵呵
哈哈
注:
解析json的是RequestResponseBodyMethodProcessor(List);
解析form表單的是ServletModelAttributeMethodProcessor(true);
解析form/data的是RequestParamMethodArgumentResolver
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态