spring-boot使用HandlerMethodArgumentResolver

用途

对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";
}

猜你喜欢

转载自blog.csdn.net/potatobeancox55555/article/details/80588507