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
posted @ 2022-03-10 09:44  BrandonFu  阅读(134)  评论(0)    收藏  举报