用途
对controllor中的执行方法中的参数进行注入
好处
业务逻辑和controllor解耦,统一处理参数注入处理的代码
用法
1.创建HandlerMethodArgumentResolver实现类
@Service
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private SeckillUserService userService;
/**
* 标志出支持的方法参数的类型
* @param parameter
* @return
*/
public boolean supportsParameter(MethodParameter parameter) {
Class<?> clazz = parameter.getParameterType();
return clazz== SeckillUser.class;
}
/**
* 向controllor方法中注入参数的实际方法
* @param parameter
* @param mavContainer
* @param webRequest
* @param binderFactory
* @return
* @throws Exception
*/
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
String paramToken = request.getParameter(SeckillUserService.COOKI_NAME_TOKEN);
String cookieToken = getCookieValue(request, SeckillUserService.COOKI_NAME_TOKEN);
if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
return null;
}
String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
return userService.getByToken(response, token);
}
/**
* 从cookie中 查找需要的cookie值
* @param request
* @param cookiName
* @return
*/
private String getCookieValue(HttpServletRequest request, String cookiName) {
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies) {
if(cookie.getName().equals(cookiName)) {
return cookie.getValue();
}
}
return null;
}
}
2.向spring中注册1中创建的类
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{
@Autowired
private UserArgumentResolver userArgumentResolver;
/**
* 配置ArgumentResolvers
* 实现采用业务逻辑,向controllor 方法中注入参数
* @param argumentResolvers
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
3.实际注入的controllor方法
@RequestMapping("/to/list")
public String list(Model model,SeckillUser user) {
model.addAttribute("user", user);
return "goods_list";
}