SpringMVC之HandlerMethodArgumentResolver和<mvc:argument-resolvers>
2016-01-29 20:30
483 查看
SpringMVC提供了一个HandlerMethodArgumentResolver接口可以让我们处理方法的参数,和注解结合提来,能有很强大的功能,例如SpringMVC提供的@ModelAttribute就是通过这种方法来处理的,它有对应的实现HandlerMethodArgumentResolver接口的类----ModelAttributeMethodProcessor,通过这种方法来处理参数
我们也可以使用一个类实现HandlerMethodArgumentResolver,在<mvc:annotation-driven>的子标签<mvc:argument-resolvers>中配置好后,SpringMVC就会调用我们写的类,然后我们在里面进行对参数的处理就好了,简单的示例代码如下,下面的功能是使用一个自定义的Java注解,来给参数设置一个初始值
Java注解如下:
@Target(value=ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValueAnnotation {
public String value() default "";
}
Resolver如下:
public class MyResolver implements HandlerMethodArgumentResolver {
/*
* 返回false则不会进入到resolveArgument方法,返回true则会
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(ValueAnnotation.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 通过parameter获取参数上的Annotation
ValueAnnotation annotation = parameter.getParameterAnnotation(ValueAnnotation.class);
// 通过Annotation获取设置的值
String value = annotation.value();
// 将值返回给参数
return value;
}
}
Controller如下:
@Controller
@RequestMapping("resolver")
public class AnnotationAndResolverController {
@RequestMapping(value = "/test")
public void test(@ValueAnnotation("123") String value) {
System.out.println(value);
}
}
会打印出123
配置如下:
<mvc:argument-resolvers>
<bean class="resolver.MyResolver"/>
<bean class="resolver.MyModelAttributeResolver"/>
</mvc:argument-resolvers>
只是简单的写了个例子来记录用法,在resolveArgument里面可以做很多事,例如在里面可以利用parameter获取参数的Class对象,然后里面反射机制来处理数据,或者在里面进行验证参数是否非空,等等。
可以看看SpringMVC提供的注解,很多利用HandlerMethodArgumentResolver处理数据,有兴趣可以看看里面的源码,有更多高级的用法,限于水平就不再展开
我们也可以使用一个类实现HandlerMethodArgumentResolver,在<mvc:annotation-driven>的子标签<mvc:argument-resolvers>中配置好后,SpringMVC就会调用我们写的类,然后我们在里面进行对参数的处理就好了,简单的示例代码如下,下面的功能是使用一个自定义的Java注解,来给参数设置一个初始值
Java注解如下:
@Target(value=ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValueAnnotation {
public String value() default "";
}
Resolver如下:
public class MyResolver implements HandlerMethodArgumentResolver {
/*
* 返回false则不会进入到resolveArgument方法,返回true则会
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(ValueAnnotation.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 通过parameter获取参数上的Annotation
ValueAnnotation annotation = parameter.getParameterAnnotation(ValueAnnotation.class);
// 通过Annotation获取设置的值
String value = annotation.value();
// 将值返回给参数
return value;
}
}
Controller如下:
@Controller
@RequestMapping("resolver")
public class AnnotationAndResolverController {
@RequestMapping(value = "/test")
public void test(@ValueAnnotation("123") String value) {
System.out.println(value);
}
}
会打印出123
配置如下:
<mvc:argument-resolvers>
<bean class="resolver.MyResolver"/>
<bean class="resolver.MyModelAttributeResolver"/>
</mvc:argument-resolvers>
只是简单的写了个例子来记录用法,在resolveArgument里面可以做很多事,例如在里面可以利用parameter获取参数的Class对象,然后里面反射机制来处理数据,或者在里面进行验证参数是否非空,等等。
可以看看SpringMVC提供的注解,很多利用HandlerMethodArgumentResolver处理数据,有兴趣可以看看里面的源码,有更多高级的用法,限于水平就不再展开
相关文章推荐
- spring 深入reading
- SpringMVC返回json数据的三种方式
- jdk目录详解及其使用方法
- The Java™ Tutorials — Generics :Wildcard Capture and Helper Methods 通配符匹配和辅助方法
- java 规范的代码结构
- Java JDBC(2)
- 使用Ant运行JUnit测试用例时,报java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing的一种解决方案
- eclipse中安装svn插件
- Java中关于i=i++的正确解释方法
- Java enum
- R语言RJava安装步骤
- Qt持久性对象进行序列化(同时比较了MFC与Java的方法)
- java自动装箱拆箱
- Spring的aop简单示例
- Twitter Snowflake 的Java实现
- Java设计模式(七)----装饰模式
- Java位运算总结:位运算用途广泛
- GC专家系列2:Java 垃圾回收的监控
- Java反射机制
- Java类的加载机制 ClassLoader