大部分摘抄自https://www.cnblogs.com/yangzhilong/p/7605889.html。
传统SpringMVC集成自定义HandlerMethodArgumentResolver的方式为:http://www.cnblogs.com/yangzhilong/p/6282218.html
在SpringBoot中是去配置文件化的,具体做法有:
1、启动类继承WebMvcConfigurerAdapter
2、另外写一个@Configuration注解的来继承WebMvcConfigurerAdapter(推荐)
import java.util.List; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.longge.LoginUserInfoMethodArgumentResolver; @SpringBootApplication public class MyBootApplication extends WebMvcConfigurerAdapter{ public static void main(String[] args) { SpringApplication.run(MyBootApplication.class, args); } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { super.addArgumentResolvers(argumentResolvers); argumentResolvers.add(new LoginUserInfoMethodArgumentResolver()); } }
import org.apache.commons.lang3.StringUtils; import org.springframework.core.MethodParameter; 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; import com.longge.utils.Constant; import com.longge.utils.RedisCacheUtils; /** * 获取用户的session dto */ public class LoginUserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public Object resolveArgument(MethodParameter arg0, ModelAndViewContainer arg1, NativeWebRequest arg2, WebDataBinderFactory arg3) throws Exception { String token = arg2.getHeader(Constant.TOKEN_KEY); if(StringUtils.isNotBlank(token)) { return RedisCacheUtils.getUserInfo(token); } return null; } @Override public boolean supportsParameter(MethodParameter arg0) { return arg0.getParameterType().equals(UserInfo.class); } }
使用方法:
@ApiOperation("新增") @PutMapping("add") public ResponseResult<SupplierDto> add(UserInfo userInfo, @Valid @RequestBody SupplierDto supplierDto) { // 这里的UserInfo不需要加任何注解,因为LoginUserInfoMethodArgumentResolver是对class的类型来解析的 }
上面是直接使用class类的方式,接下来使用注解的方式来实现
import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CurrentUser { }
import com.chinamobile.annation.CurrentUser; import com.chinamobile.dto.CurrentUserData; import com.chinamobile.util.RedisUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.util.StringUtils; 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; public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private RedisUtil redisUtil; public CurrentUserMethodArgumentResolver() { } @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(CurrentUser.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String accessToken = webRequest.getHeader("authorization"); if (StringUtils.isEmpty(accessToken)) { return null; } Object object = redisUtil.get(accessToken); if (object instanceof CurrentUserData) { return object; } return null; } }
这里的RedisUtil是一个redis的处理类,自行实现就是。
import com.CurrentUserMethodArgumentResolver; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List; @Configuration @Slf4j public class ApiConfig extends WebMvcConfigurerAdapter { /** * 注册解析器bean * * @return */ @Bean public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() { return new CurrentUserMethodArgumentResolver(); } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(currentUserMethodArgumentResolver()); } }
使用如下:
/** * 修改用户信息 * * @param userId * @param addUserModel * @param currentUserData * @return */ @PutMapping(value = "/users/{userId}") public CommonResponse<String> updateUser(@PathVariable("userId") Integer userId, @RequestBody AddUserModel addUserModel, @CurrentUser CurrentUserData currentUserData) { CommonResponse<String> commonResponse = new CommonResponse<>(); try { Integer updateBy = currentUserData.getUserId(); // 参数校验 if (userId == null) { commonResponse.setCode(ResponseCode.PARAMETER_ERROR); commonResponse.setMsg("参数校验未通过,请检查参数合法性"); log.info("Parameter check failed."); }else { commonResponse.setCode(ResponseCode.SUCCESS); commonResponse.setMsg("修改用户成功."); log.info("Update user info success."); } } catch (Exception ex) { log.error("SERVER_ERROR: " + ex); commonResponse.setCode(ResponseCode.SERVER_ERROR); commonResponse.setMsg("SERVER_ERROR"); } return commonResponse; }
相关推荐
springboot-父子工程-初始版(包含CRUD示例接口) jpa-hibernate-dm: 数据库为{国产达梦数据库},持久层技术为jpa-hibernate mybatis-dm: 数据库为{国产达梦数据库},持久层技术为mybatis mybatis-plus-dm: 数据库为{...
从零初始化一个SpringBoot项目,集成PostgreSQL并使用JPA和MyBatis两种方式对其进行操作。这里只记录PostgreSQL相关操作,项目创建过程不详细介绍,类似流程可参考文章从零开始初始化后台项目>>...
sdk初始化; 设备注册,v30与v40; 获取通道号,v30与v40; 获取通道号名称; 文件搜索,v30与v40; 文件下载,通过文件名称下载,发送下载指令; 下载进度值,支持多文件或许进度值; 监听,布防
博主看到新服务是封装的自定义异常,准备入手剖析一下,...第一步:肯定是在Springboot启动的过程中进行的异常处理初始化,于是就找到了handlerExceptionResolver类,在创建该类的时候,会进行添加我们自定义异常。
该示例资源主要解决如下两个问题,其一就是解决SpringBoot集成DWR3.0.2-RELEASE版本,无配置文件快速简洁完成集成工作,省去dwr.xml等DWR框架初始化需要的配置文件;其二就是解决了集成后的SpringBoot项目在开发环境...
1、自定义注解实现Aop 通知 2、集成redis简单试用测试 3、集成RabbitMq模仿五种消息模型 4、简单爬去一个电商的某些信息
自定义Spinner实现初始为请选择之类的不参与列表的显示
1 校验的错误提示 校验时,出错信息须用双引号或单引号 1998/10 ...3 如何给字符型字段以自定义初始值? 1、在数据表中,某一字段set to default时选user,然后在Init中输入字符串,则次字符串为缺省字符串
Android轻量化开发,使用自定义注释来初始化控件
SpringBoot项目启动时实现调用一次初始化方法
matlab_使用ga算法改进elman神经网络,优化elman参数初始值_遗传算法
springboot、logback源码解读,对logback从初始化到,配置文件加载到日志打印,所有步骤的源码分析
主要介绍了springboot实现rabbitmq的队列初始化和绑定,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了详解SpringBoot程序启动时执行初始化代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
对博弈论模型进行仿真,可以模拟出不同初始点在不同初始值时的演化路径,matlab源码
NULL 博文链接:https://geyubin.iteye.com/blog/1562868
自定义事件,集成ApplicationEvent 定义事件监听器,实现ApplicationListener 使用容器发布事件 Spring高级话题 Spring Aware BeanNameAware BeanFactoryAware ApplicationContextAware ...
java的spring-boot工程使用digest方式对zookeeper进行权限控制,包括初始化zk,以及增删改查等
mcgs嵌入版掉电存储,初始值运行参数值,简单易学。