Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker 诊断工具


Spring Boot 自定义 HandlerMethodArgumentResolver 接收 Controller 方法参数

Spring Boot 大约 1916 字

自定义注解

指定使用在@RequestMapping标柱的方法参数上。

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyParam {

}

自定义对象

@Data
public class MyParamWrapper {

    private String traceId;

    private String token;

}

自定义 HandlerMethodArgumentResolver

public class MyArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // MyParam 注解要标注 @Target(ElementType.PARAMETER)
        boolean hasParameterAnnotation = parameter.hasParameterAnnotation(MyParam.class);
        boolean assignable = MyParamWrapper.class.isAssignableFrom(parameter.getParameterType());
        return hasParameterAnnotation && assignable;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

        String traceId = webRequest.getHeader("trace-id");
        String token = webRequest.getHeader("token");

        MyParamWrapper wrapper = new MyParamWrapper();
        if(StringUtils.hasText(traceId)){
            wrapper.setTraceId(traceId);
        }
        if(StringUtils.hasText(token)){
            wrapper.setToken(token);
        }
        return wrapper;
    }
}

注入 HandlerMethodArgumentResolver

@Configuration
public class WebConfig {

    @Bean
    public WebMvcConfigurer getWebMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
                resolvers.add(new MyArgumentResolver());
            }
        };
    }

}

使用

@RestController
public class ResolverController {

    @GetMapping("/argument")
    public String argument(@MyParam MyParamWrapper myParamWrapper) {
        return myParamWrapper.toString();
    }

}
阅读 717 · 发布于 2023-02-01

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批