作用
使用参数解析器,给你的 Controller 添加统一入参
使用
实现 HandlerMethodArgumentResolver ,重写 supportsParameter 方法和 resolveArgument 方法
resolveArgument 执行取决于 supportsParameter 返回值,true 执行,false 不执行
注解
import java.lang.annotation.*;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserId {
}
代码
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
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;
/**
* 功能描述
*
* @author jason
*/
@Component
public class UserIdMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
// 当参数上有 @UserId 时才使用该解析器解析
return parameter.hasParameterAnnotation(UserId.class);
// 根据参数类型为 UserNameRequest.class 判断
// return ObjectUtil.equals(parameter.getParameterType(), UserNameRequest.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
// 假设获取到了 userId
return "userId:9527";
}
}
注册
import org.springframework.beans.factory.annotation.Autowired;
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 MyInterceptorConfig extends WebMvcConfigurationSupport {
@Autowired
private UserIdMethodArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
使用
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
/**
* http://127.0.0.1:8080/test/find
*/
@GetMapping("/find")
public String find(@UserId String userId) {
log.info("userId:{}", userId);
return "success";
}
}
测试