1. 程式人生 > >SpringMVC之HandlerMethodArgumentResolver和

SpringMVC之HandlerMethodArgumentResolver和

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處理資料,有興趣可以看看裡面的原始碼,有更多高階的用法,限於水平就不再展開