spring boot Controller 添加注入参数
需求
调用controller的时候直接注入一个user对象。
解决方法
通过head里面的token获取到账号到数据库查询接口。
但是为了可用性使用不能每次都写同样的代码。
可以如果在controller可以想注入 request一样注入一个user 对象就太完美了。
无废话直接上代码
定义一个handler实现HandlerMethodArgumentResolver类,并且重写resolveArgument方法。具体看代码
@Service
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
ISysUserService iSysUserService;
//supportsParameter 指定当参数类型为 User 类时才应用该参数解析器
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(SysUser.class);
}
//自定义的参数解析逻辑,例如创建一个 User 对象并返回
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String userId = authentication.getPrincipal().toString();
SysUser user = iSysUserService.getUserByUserId(userId);
return user;
}
}
配置 WebMvcConfigurer 添加自定义参数解析器。
这里要的 WebMvcConfigurer 可以配置多个。可以用 @Order 定义加载顺序
@Order(2)
@Configuration
public class UserWebMvcConfigurer implements WebMvcConfigurer {
@Autowired
private UserArgumentResolver userArgumentResolver;
/**
* 添加自定义参数解析器
* @param argumentResolvers
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
愉快的使用
@RequestMapping(value = "/saveFile", method = RequestMethod.POST)
@ResponseBody
@ApiOperation("上传文件")
public JSONResult uploadFile(SysUser user, @ApiParam("文件") @RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return JSONResult.errorMsg("必须上传文件");
}
return JSONResult.ok(iSysFileService.saveFile(user.getId(), file));
}