SpringBoot @ModelAttribute 用法
前言
项目中遇到这么一个使用场景,用户的登录信息给予token保存,在需要有登录信息的地方,每次都要去获取用户Id,但每次在请求方法中去获取用户信息,代码重复,冗余,很low于是想到了用@ModelAttribute 这个属性
使用场景
不用@ModelAttribute 时候在需要用户信息的请求中每次需要单独获取用户信息
String token = request.getAttribute("token").toString();
User LoginUser = tokenService.decodeToken(token);
代码重复每次都需要单独去写,
于是我想到了去优化一下代码,在需要使用户信息的controller中写一个公共方法,每次直接获取就可以了
private User gerUserInfo(HttpServletRequest request){
String token = request.getAttribute("token").toString();
User LoginUser = tokenService.decodeToken(token);
return LoginUser;
}
这样写代码是简化了一些,但是没什么特别大的改观,还是要在每个需求用户信息的请求Controller中调用此方法取获取用用户信息,如果多个Controller需要获取用户信息的话还需要重复写
也是想到继承,写一个公共的controller叫BaseController,每次在需要用户信息的controller中继承BaseController 然后在调用就可以了
@RestController
public class BaseController {
@Autowired
private TokenService tokenService;
private User gerUserInfo(HttpServletRequest request){
String token = request.getAttribute("token").toString();
User LoginUser = tokenService.decodeToken(token);
return LoginUser;
}
}
这样看上去似乎比之前两种做法都简单便捷很多,在需要使用用户信息的controller中直接继承调用就可以啦,但是并没有根本解决我们的问题,我们还是需要写重复代码,在每个controller单独获取用户信息,这是最优嘛?并不是!!!
其实呢springboot提供@ModelAttribute这个注解属性使用这个通过参数注入就可获取啦
我们把上面的稍微调整一下如:
@RestController
public class BaseController {
@Autowired
private TokenService tokenService;
@ModelAttribute
public void userInfo(ModelMap modelMap, HttpServletRequest request) {
String token = request.getAttribute("token").toString();
User LoginUser = tokenService.decodeToken(token);
modelMap.addAttribute("LoginUser", LoginUser);
modelMap.addAttribute("userId", LoginUser.getUserId());
}
}
然后在需要使用用户信息的controller中进行参数映射就行啦
@ApiOperation(value = "用户快过期优惠卷信息",tags = "优惠卷接口")
@GetMapping("/expiredCoupon")
public List<Coupon> userExpiredCoupon(@ModelAttribute("userId") @ApiParam(hidden = true) String userId){
return couponService.getUserExpiredCoupon(userId);
}
@GetMapping("/info")
@ApiOperation("获取用户信息")
public User getUseInfo(@ModelAttribute("LoginUser") User user) {
return user;
}
这样用户信息通过形参直接注入到controller中,我们直接在请求中使用就可以啦
@ModelAttribute详解
- 被
@ModelAttribute注释的方法会在此controller每个方法执行前被执行
标注在方法上面的注解,将方法返回的对象存储在model中,该方法在这个控制器其他映射方法执行之前调用 @ModelAttribute注释一个方法的参数 从model中获取参数@ModelAttribute("LoginUser") User user参数user的值来源于BaseControlleruserInfo()方法中的model属性
具体更详细使用参考 @ModelAttribute注解的使用总结
SpringBoot @ModelAttribute 用法的更多相关文章
- SpringBoot进阶用法-随笔
SpringBoot进阶用法 实现setApplicationContext //实现ApplicationContextAware接口,重写setApplicationContext方法 publi ...
- ModelAttribute用法之一
@ModelAttribute也可以做为Model输出到View时使用,比如: 测试例子 package com.my.controller; import java.util.ArrayList ...
- SpringBoot HATEOAS用法简介
REST风格简介 介绍HATEOAS之前先简单介绍一下REST,REST 是 Representational state transfer 的缩写,翻译过来的意思是表达性状态转换.REST是一种架构 ...
- springboot中filter的用法
一.在spring的应用中我们存在两种过滤的用法,一种是拦截器.另外一种当然是过滤器.我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别. 二 ...
- 基于SpringBoot搭建应用开发框架(二) —— 登录认证
零.前言 本文基于<基于SpringBoot搭建应用开发框架(一)——基础架构>,通过该文,熟悉了SpringBoot的用法,完成了应用框架底层的搭建. 在开始本文之前,底层这块已经有了很 ...
- SpringBoot系列: Spring MVC视图方法的补充
SpringMVC 视图方法的参数, 已经在这个文章中写得非常清楚了, 链接为 https://www.cnblogs.com/morethink/p/8028664.html 这篇文章做一些补充. ...
- Spring @ModelAttribute
正文开始之前,先介绍个东西,Spring能够自动将请求参数封装到对应JavaBean上! 代码比较简单,也没有什么配置要记录,只是开启了<mvc:annotation-driven/>,可 ...
- SpringBoot入门 简单搭建和使用
前言 差不多两年前,那个时候我准备要做毕业设计了,才第一次知道java有框架这种东西,在网上找了好多SSM的教程,那会儿真的是Spring+SpringMVC+MyBatis搭建的,印象极深的是还要写 ...
- Spring MVC中Controller如何将数据返回给页面
要实现Controller返回数据给页面,Spring MVC 提供了以下几种途径: ModelAndView:将视图和数据封装成ModelAndView对象,作为方法的返回值,数据最终会存到Http ...
随机推荐
- Unity接入ShareSDK实现QQ登录和QQ分享、微信分享
原文链接:Unity接入ShareSDK实现QQ登录和QQ分享.微信分享 由于微信登录需要企业审核,我这里就不说明了,有需要的可以去官网看一下文档,和QQ登录比多了一个打包的步骤. 第一步:到官网申请 ...
- 16 自动发布PHP项目
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin PHP_NAME=$1 DATE ...
- 我用段子讲.NET之依赖注入其二
<我用段子讲.NET之依赖注入其二> "随着我们将业务代码抽象化成接口和实现两部分,这也使得对象生命周期的统一管理成为可能.这就引发了第二个问题,.NET Core中的依赖注入框 ...
- SpringBoot:SpringBoot项目中 HttpServletRequest ServletInputStream 读取不到文件数据流
在Springboot程序启动后,会默认添加OrderedCharacterEncodingFilter和HiddenHttpMethodFilter过滤器.在HiddenHttpMethodFilt ...
- 查看python的安装版本,位数及安装路径
一.想要查看ubuntu中安装的Python路径 方法一:whereis python (用来快速查找任何文件,是一个文件搜索命令,与locate的功能一样.执行whereis python 会将所有 ...
- Redis的内存回收原理,及内存过期淘汰策略详解
Redis 内存回收机制Redis 的内存回收主要围绕以下两个方面: 1.Redis 过期策略:删除过期时间的 key 值 2.Redis 淘汰策略:内存使用到达 maxmemory 上限时触发内存淘 ...
- 性能基准DevOps之如何提升脚本执行效率
1.宝路说 宝路最近一直在自我思考:性能基准DevOps工作已经开展一段时间了,目前我们确实已经取得了一些成果,显然这还远远不够.趁闲暇之余跟组员进行了简单的头脑风暴!于是这就有了今天的主题,当然这仅 ...
- Java | this的本质 和 static的本质
this 在说this之前先说一下,对象创建的过程: 1.分配对象空间,并将对象成员变量初始化. 2.执行属性值的显式初始化. 3.执行构造方法. 4.返回相关的地址给相关的对象. this的本质 ...
- python使用笔记17--异常处理
什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Pyth ...
- python adb 关闭拼多多
def gbpdd(sjh): aaka="adb -s {0} shell am force-stop com.xunmeng.pinduoduo".format(sjh) aa ...