怎么在请求方法之前绑定/修改参数值

1.继承或者实现WebMvcConfigurer相关类/接口

①.spring5.0之前 继承WebMvcConfigurerAdapter类

代码如下:

@Configuration
public class UserConfig extends WebMvcConfigurerAdapter {
    
    /**
     * 自定义的参数解析器
     */
    @Autowired
    private UserArgumentResolver userArgumentResolver;

    @Override
    public void addArgumentResolvers(
List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(userArgumentResolver);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

②.spring5.0之后 实现 WebMvcConfigurer 接口

代码如下:

@Configuration
public class WebConfig  implements WebMvcConfigurer {

    @Autowired
    private UserArgumentResolver userArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(userArgumentResolver);
    }
}

2.添加自定义参数解析器,实现HandlerMethodArgumentResolver接口

代码如下:

@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {

    String serverName = "OPERATION-DF-ORGANIZATION";

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 指定符合条件的参数
     * @param methodParameter
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        String parameterName = methodParameter.getParameterName();
        //指定参数名含有userId的
        return StringUtils.equals(parameterName,"userId");
    }

    /**
     *
     * @param methodParameter
     * @param modelAndViewContainer
     * @param nativeWebRequest
     * @param webDataBinderFactory
     * @return
     * @throws Exception
     */
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        String userCode = request.getHeader("userCode");
        String url = "http://"+serverName+"/data-manager/user/queryByLoginId?login_Id="+userCode;
        ObjectRestResponse response = restTemplate.getForObject(url, ObjectRestResponse.class);
        LinkedHashMap data = (LinkedHashMap) response.getData();
        return data.get("id") == null ? "" : data.get("id").toString();
    }
}

3.使用自定义或者修改的参数userId

怎么在请求方法之前绑定/修改参数值

直接在方法参数前面加上String userId,参数就能绑定成功!

说明:这里是用的userId举例,是可以修改这个userId的,在本服务中并没有走网关,也没有走鉴权服务,是不安全的做法,本方案适用于不安全的做法,用于重写请求参数