使用示例
文首说了,HandlerMethod作为一个非公开API,如果你要直接使用起来,还是稍微要费点劲的。
但本文还是给出一个Demo,给出小伙伴们最为关心也是对你们最有用的一个需求:ModelFactory.getNameForParameter(parameter)这个静态方法是给入参生成默认名称的,当然默认处理方案最底层依赖的是它Conventions.getVariableNameForParameter(parameter),为了验证这块对象、Object、List等等常用数据结构的默认处理,此处我借助HandlerMethod一次性全部打印出这个结论:
@Getter @Setter @ToString public class Person { @NotNull private String name; @NotNull @Positive private Integer age; public Object demoMethod(Person person, Object object, List<Integer> intList, List<Person> personList, Set<Integer> intSet, Set<Person> personSet, Map<String, Object> myMap, String name, Integer age, int number, double money) { return "hello parameter"; } }
借助HandlerMethod完成此测试用例
public static void main(String[] args) { // 准备一个HandlerMethod HandlerMethod handlerMethod = new HandlerMethod(new Person(), getPersonSpecfyMethod()); // 拿到该方法所有的参数 MethodParameter[] methodParameters = handlerMethod.getMethodParameters(); for (MethodParameter parameter : methodParameters) { Class<?> parameterType = parameter.getParameterType(); String nameForParameter = ModelFactory.getNameForParameter(parameter); System.out.println("类型" + parameterType.getName() + "--->缺省的modelKey是:" + nameForParameter); } } private static Method getPersonSpecfyMethod() { for (Method method : Person.class.getMethods()) if (method.getName().equals("demoMethod")) return method; return null; }
运行,打印结果如下:
类型com.fsx.bean.Person--->缺省的modelKey是:person 类型java.lang.Object--->缺省的modelKey是:object 类型java.util.List--->缺省的modelKey是:integerList 类型java.util.List--->缺省的modelKey是:personList 类型java.util.Set--->缺省的modelKey是:integerList // 可以看到即使是set 名称也是同List的 类型java.util.Set--->缺省的modelKey是:personList 类型java.util.Map--->缺省的modelKey是:map 类型java.lang.String--->缺省的modelKey是:string 类型java.lang.Integer--->缺省的modelKey是:integer 类型int--->缺省的modelKey是:int 类型double--->缺省的modelKey是:double
这个结果是不同类型对应的缺省的ModelKey,希望小伙伴们能够记下来,这对理解和正确使用@SessionAttributes、@ModelAttribute都是很重要的~
总结
HandlerMethod虽然接触少,但并不影响它的重要性。在理解Spring MVC的处理流程上它很重要,在与使用者关系较大的拦截器HandlerInterceptor定制化处理的时候,学会使用它一样是非常有必要的。
在最后还提示大家一个你可能没有关心到的小细节:
- HandlerMethod位于org.springframework.web.method包下,且是3.1后才有的
- MethodParameter位于org.springframework.core核心包中。2.0就存在了