简介
调用接口时,有可能有能多参数,Spring项目中就会定义很多的@RequestParam,让我们很抓毛。好在Spring 3.1开始提供的接口HandlerMethodArgumentResolver
,实现此接口可以自定义对象,比如可以解析自定义的时间格式、自定义解析Map对象等这些spring原本不支持的对象格式。
代码
这一以一个Integer类型做例子。代码如下:
自定义注解 @LoginUser
LoginUser.java
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
自定义一个解析器LoginUserHandlerMethodArgumentResolver
我们在解析器中返回一个固定的Object
,实际情况是可以返回一个自定义对象。
LoginUserHandlerMethodArgumentResolver.java
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
public static final String LOGIN_TOKEN_KEY = "X-Litemall-Token";
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().isAssignableFrom(Integer.class) && parameter.hasParameterAnnotation(LoginUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
NativeWebRequest request, WebDataBinderFactory factory) throws Exception {
// return new Integer(1);
String token = request.getHeader(LOGIN_TOKEN_KEY);
if (token == null || token.isEmpty()) {
return null;
}
return UserTokenManager.getUserId(token);
}
}
其次还要将我们自己实现的WxWebMvcConfiguration
加入到参数解析器集中,如下:
@Configuration
public class WxWebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver());
}
}
使用
在控制器中使用,@LoginUser Integer userId
可自动注入自定义的类型。
@GetMapping("list")
public Object list(@LoginUser Integer userId) {
if (userId == null) {
return ResponseUtil.unlogin();
}
List<LitemallAddress> addressList = addressService.queryByUid(userId);
return ResponseUtil.okList(addressList);
}