本文共 1466 字,大约阅读时间需要 4 分钟。
注意:该接口并不是责任链模式,也就是说,spring发现一个解析器能解析该参数的时候,spring不会再去调用下一个解析器
使用场景:之前我遇见过,前台传递的数据格式是PHP遵循的数据规范,是这个样子的:{“user_name”:“hehe”},因为SpringMVC中只能对驼峰标识(userName)解析,而不能对下划线这种格式解析,所以此处应该自定义参数解析器
1.实体类public class User1(){ private String userName;}public class User2(){ private String userName;}2.定义Controller@Controllerpublic class MyController{ @RequestMapping("m1") public void m1(User1 u1,User2 u2){ //注意此处是两个参数 System.out.println(u1.getName()); System.out.println(u2.getName()); }}自定义HandlerMethodArgumentResolverpublic 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
转载地址:http://othws.baihongyu.com/