spring boot 最佳实践(八)-- 请求上下文注入
来源:互联网 发布:c stl程序员开发指南 编辑:程序博客网 时间:2024/06/10 07:30
开发Web API时除了用户请求参数以外,还有一些和请求状态相关的信息,比如登陆用户,购物车商品,user-agent,IP等。通常做法是采用HttpSession或request.attribute来存这些对象.然后从Controller拿到HttpRequest一层层的调用。但在无状态web服务中没有session信息,在service中操作request也不利于单元测试和接口解耦。spring MVC为我们提供了自定义的方法参数注入接口,可以在需要的controller中为我们注入需要的请求上下文参数。
我们以登陆用户的注入为例演示实现方法。
如果我们使用spring security,登陆用户的信息被保存到http请求上下文中。所以我们需要实现WebArgumentResolver接口。
public class LoginUserArgumentResolver implements WebArgumentResolver { @Override public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); if (methodParameter.getParameterType() == null || !methodParameter.getParameterType().equals(LoginUser.class)) { return UNRESOLVED; } return request.getAttribute("loginUser"); }}
我们需要在spring boot中配置这个参数处理类。
@Configurationpublic class AppConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(new ServletWebArgumentResolverAdapter(new LoginUserArgumentResolver())); }}
由于WebMvcConfigurer要求注入的接口是HandlerMethodArgumentResolver,所以需要ServletWebArgumentResolverAdapter做封装。如果我们不需要依赖http请求上下文可以直接实现HandlerMethodArgumentResolver接口。
然后我们就可以在controller中愉快的使用LoginUser了。
@RequestMapping(value = "/logout",method = RequestMethod.POST)public void logout(LoginUser loginUser){ accountService.logout(loginUser);}
阅读全文
0 0
- spring boot 最佳实践(八)-- 请求上下文注入
- spring boot 最佳实践(五)--SpEL
- Spring静态注入最佳实践
- spring boot 最佳实践(四)--Spring MVC
- spring boot 最佳实践(六)--Spring Cache
- spring boot 最佳实践(七)-- spring-retry
- spring boot 最佳实践(一)--使用jackson
- spring boot 最佳实践(二)--使用Bean Validation
- spring boot 最佳实践(三)--使用java.time
- spring boot 最佳实践(九)-- 数据访问权限
- RocketMQ最佳实践(三)开发spring-boot-starter-rocketmq实现与spring boot项目的整合
- spring boot 依赖注入
- Spring Boot 依赖注入
- spring Boot测试的最佳实践和测试架构的启发(JUnit4和mockito,包括MockMvc)
- Spring 配置最佳实践
- spring AOP 最佳实践
- Spring Boot实践应用开发(1)
- Spring Boot实践应用开发(2)
- 面试产品经理时,怎样判断TA是否适合做产品?
- UGC产品的氛围和秩序
- Navicat连接mysql失败
- 作业2 tcp
- C/C++处理十六进制数和字符串
- spring boot 最佳实践(八)-- 请求上下文注入
- UDP协议
- memtier_bennch 分析
- 条件概率、全概率公式与贝叶斯公式
- CUDA7.5+OpenCV3.1+VS2013+Win7配置
- python+selenium初级(9)—文件上传
- 7个实例全面掌握Hadoop MapReduce
- 推荐使用的超级简单paddlepaddle机器学习入门
- 10万点击率的“干货”,其实人人都写得出来