Spring Web HandlerMethodReturnValueHandler 为handler 方法参数赋值
在springMVC中可以通过实现 HandlerMethodReturnValueHandler 接口来实现 handler 方法参数赋值。
本文档记录我使用HandlerMethodArgumentResolver的过程。
文档使用的示例是在handler method中我添加了一个参数User user.我使用了@CurrentUser进行注解(这个注解不是必要的)。记录了通过实现HandlerMethodReturnValueHandler接口为这个参数赋值过程。
步骤1 定义annotation:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserAnnotation {
}
步骤2 实现HandlerMethodReturnValueHandler接口:
package com.example.demospringhandlermethodargumentresolver;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
/**
* 此方法确定当前参数是否需要处理
* @param parameter
* @return
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
if (parameter.hasParameterAnnotation(UserAnnotation.class)) {
return true;
} else {
return false;
}
}
/**
* 此方法是对参数的处理结果,返回值将被赋值给handler method的对应参数
* @param parameter
* @param mavContainer
* @param webRequest
* @param binderFactory
* @return
* @throws Exception
*/
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
User user = new User();
user.setUserName("Brandon");
user.setAge(18);
String userName = webRequest.getParameter("userName");
webRequest.getHeader("Token");
System.out.println(userName);
return user;
}
}
步骤3 配置ArgumentResolvers:
package com.example.demospringhandlermethodargumentresolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(currentUserMethodArgumentResolver());
super.addArgumentResolvers(argumentResolvers);
}
@Bean
public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
return new CurrentUserMethodArgumentResolver();
}
}
步骤4 使用注解实现方法参数注入:
@GetMapping
public String hello(@UserAnnotation User user) {
return String.format("Hello %s\r\n", user.getUserName());
}
测试结果:
访问对应的接口返回:
Hello Brandon

浙公网安备 33010602011771号