Spring boot 配置參數解析器
使用場景:將當前登錄的用戶注入到接口參數裏。
例如:
@RequestMapping(value = "/delete")
@Transactional
public ResultInfo deleteUserInfo(@User UserInfo userInfo) {
return new ResultInfo(ErrCode.OK, "", userInfo.getUsername());
}
首先創建User註解:
@Documented
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface User {
}
然後創建自定義解釋器,當參數爲UserInfo,且使用User註解標明的參數採用該解釋器進行解釋
@Component
public class UserInfoResolver implements HandlerMethodArgumentResolver {
private UserInfoService userInfoService;
public UserInfoResolver(UserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().isAssignableFrom(UserInfo.class)
&& methodParameter.hasParameterAnnotation(User.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) throws Exception {
String username;
try {
username = (String) nativeWebRequest.getAttribute(Param.USERNAME, RequestAttributes.SCOPE_REQUEST);
} catch (Exception e) {
username = null;
}
if (username != null) {
return userInfoService.findOneByUsername(username);
}
return new MissingServletRequestPartException(Param.USERNAME);
}
}
將該解釋器配置在項目中
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
private UserInfoService userInfoService;
@Autowired
public WebConfig(UserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new UserInfoResolver(userInfoService));
}
}
此時deleteUserInfo(@User UserInfo userInfo)方法中的 userInfo就是當前用戶的信息了。