大部分摘抄自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; }
相关推荐
本主题将深入探讨如何在Spring Boot工程中通过自定义response注解、利用Java反射机制、设置自定义拦截器以及实现WebMvcConfigurer接口来实现这一目标。 首先,我们来看自定义response注解。在Spring Boot中,可以...
在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始化和配置过程。在处理敏感数据时,脱敏是一个重要的安全措施,它指的是在展示或存储个人信息时,部分替换或隐藏关键信息,如身份证...
本项目“业务异常提示处理 springboot+Assert(自定义断言)”着重于利用Spring Boot的特性来构建高效、易维护的业务逻辑,并通过自定义断言提升代码的可读性和可维护性。下面我们将详细探讨这些知识点。 1. **Spring...
通过这个SpringBoot集成OCR功能的示例项目,开发者可以学习到如何将OCR技术融入到Spring Boot应用中,提升应用的智能化程度,从而提高工作效率和用户体验。同时,这也是一个了解和实践Java Web开发、RESTful API调用...
在本文中,我们将深入探讨如何在SpringBoot应用中集成Impala数据仓库系统,以及涉及到的相关配置和步骤。首先,我们来看看关键的组成部分: 1. **SpringBoot集成**: SpringBoot是基于Spring框架的一个轻量级开发...
综上所述,SpringBoot集成H5微信支付宝支付,主要涉及支付接口的调用、参数配置、支付结果处理等步骤。通过合理的设计与实现,我们可以构建出高效、稳定的支付系统,提升用户的购物体验。在实际开发中,还需要根据...
然后,在Spring Boot的配置文件`application.yml`或`application.properties`中,我们需要配置CKFinder的相关参数,例如访问路径、存储位置、权限控制等。这可能包括: ```yaml ckfinder: base-path: /ckfinder ...
SpringBoot集成WebMagic实现网页数据爬取功能是一个常见的实践,特别是在大数据分析、信息抓取以及自动化测试等领域。这个项目提供了一个可以直接使用的示例工程,帮助开发者快速理解和应用爬虫技术。 1. **...
在本文中,我们将深入探讨如何将SeetaFace6JNI集成到SpringBoot应用中,实现高效的人脸检测和识别功能。SeetaFace6JNI是SeetaFace6库的一个Java封装,它提供了一种与Java应用程序交互的方式,使得在Java环境中也能...
现在,SpringBoot应用已经集成了Mina,并且具备了自定义解码器的能力。当启动应用时,Mina服务器将监听指定的端口,等待客户端的连接,并通过自定义解码器解析接收到的消息。这样,你就可以在SpringBoot的环境中轻松...
在IT行业中,Spring Boot是一个非常流行的微服务框架,它简化了Spring应用的初始搭建以及开发过程。而Redis则是一款高性能的内存数据结构存储系统,常用于实现缓存、消息队列等功能。MyBatis作为持久层框架,为...
在本文中,我们将深入探讨如何将SpringBoot与quartz 2.2.3集成,以及如何利用自定义数据源和WebSocket技术实现高效、灵活的定时任务管理和前后端通信。首先,我们来理解SpringBoot和quartz的核心概念。 **...
总之,这个"springboot集成jsp的简单例子"是一个很好的学习资源,它涵盖了Spring Boot与JSP集成的基本操作,以及在实际开发中经常遇到的拦截器和中文乱码问题的解决方案。对于初学者来说,这是一个很好的起点,可以...
springboot-父子工程-初始版(包含CRUD示例接口) jpa-hibernate-dm: 数据库为{国产达梦数据库},持久层技术为jpa-hibernate mybatis-dm: 数据库为{国产达梦数据库},持久层技术为mybatis mybatis-plus-dm: 数据库为{...
在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始搭建以及开发过程,提供了自动配置、起步依赖等特性。本项目聚焦于将富文本编辑器集成到Spring Boot应用中,以增强用户界面的内容...
SpringBoot 2.4.4 集成Ignite是一个常见的技术实践,旨在利用Ignite的强大功能来提升应用程序的性能和可扩展性。Ignite是一个开源的内存数据网格,提供了分布式缓存、分布式计算、流处理和实时分析等功能。下面我们...
本教程将详细介绍如何将Flowable Modeler 6.4.1集成到Spring Boot项目中,并实现用户免登功能,同时确保BPMN组件已经汉化,便于中国用户使用。 首先,我们需要了解Flowable Modeler。Flowable Modeler是一款基于Web...
SpringBoot是一款由Pivotal团队开发的轻量级框架,它基于Spring框架,简化了初始化配置,提供了自动配置功能,使得开发者能够更快速地构建高质量的Web应用。而JimuReport是一款强大的在线报表工具,它可以方便地进行...
再来看Druid,它是一个功能强大且性能优异的数据库连接池,提供了监控、SQL解析、参数绑定等功能。在SpringBoot项目中,我们可以通过`spring-boot-starter-jdbc` starter添加Druid,然后在`application.properties`...
在"springboot基础框架,含请求参数自定义解析,动态数据源配置等功能"这个项目中,我们将探讨两个关键知识点:请求参数自定义解析和动态数据源配置。 1. 请求参数自定义解析: 在SpringBoot中,我们通常使用`@...