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的值来源于BaseController
userInfo()方法中的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 ...
随机推荐
- 玩转html2canvas以及常见问题解决
前端小伙伴经常会遇到页面截图或者把网页中指定的区域(某个大div)的内容转换成png的图片.这个时候常常会用到html2canvas库来实现,js真的很强大. 我最近也遇到了一个需求,需要把输入的文本 ...
- Linux安装及管理程序
一,常见的软件包封装类型 二.RPM包管理工具 三.查询RPM软件包信息 四.安装.升级.卸载RPM软件包 五.解决软件包依赖关系的方法 六.源代码编译 七.安装yum源仓库 一,常见的软件包封装类型 ...
- python基本函数增删改排序,用range()求和
a=["blue","red","brack"] print(len(a))#列表长度 a.append("yellow" ...
- 乘风破浪,遇见华为鸿蒙智能终端系统(HarmonyOS 2),打造面向全场景的分布式操作系统
什么是鸿蒙智能终端系统(HarmonyOS 2) HarmonyOS 是新一代的智能终端操作系统,为不同设备的智能化.互联与协同提供了统一的语言.带来简洁,流畅,连续,安全可靠的全场景交互体验. ht ...
- 8、inotify和resync的优缺点
只有对外提供访问的服务需要有端口号,本地服务无端口号: 8.1.inotify的优缺点: 1.优点: 监控文件系统事件变化,通过同步工具实现实时的数据同步 2.缺点: 并发如果大于200个文件(10- ...
- 【译】GO语言:管理多个错误
原文:https://medium.com/a-journey-with-go/go-multiple-errors-management-a67477628cf1 关于开发者使用Go遇到的最大挑 ...
- 深入理解 Go Map
文章参考:Go语言设计与实现3.3 哈希表 哈希表的意义不言而喻,它能提供 O(1) 复杂度的读写性能,所以主流编程语言中都内置有哈希表. 哈希表的关键在于哈希函数, 好的哈希函数能减少哈希碰撞,提供 ...
- [心得]redis集群环境搭建的错误
安装redis集群需要版本号在3.0以上 redis-cluster安装前需要安装ruby环境 搭建集群需要使用到官方提供的ruby脚本. 需要安装ruby的环境. yum -y install ru ...
- Http2.0详解
前言 HTTP/1.1协议为现在网络提供了20年的支持.从那时起,网站已经从静态的.文本驱动的文档发展为交互式的.富媒体的应用程序.在此期间底层协议保持不变这一事实正好说明了它的通用性和能力.但随着网 ...
- 路由算法(Dijkstra算法以及遗传算法)
(1)Dijkstra算法 1 class Dijkstra(Algorithm): 2 """Dijkstra algorithm for unicast route ...