SpringBoot @ModelAttribute使用场景分析

 更新时间:2021年08月10日 08:56:24   作者:kenx  
这篇文章主要介绍了SpringBoot @ModelAttribute使用场景分析,文中通过实例代码图文相结合给大家介绍的非常详细,需要的朋友可以参考下

前言

项目中遇到这么一个使用场景,用户的登录信息给予token保存,在需要有登录信息的地方,每次都要去获取用户Id,但每次在请求方法中去获取用户信息,代码重复,冗余,很low于是想到了用@ModelAttribute 这个属性

@ModelAttribute有三种用法:
- 可以标注在方法上;
- 可以标注在方法中的参数上;
- 还可以和@RequestMapping一起标注在方法上;

使用场景

不用@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需要获取用户信息的话还需要重复写

也是想到继承,写一个公共的controllerBaseController,每次在需要用户信息的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 @ModelAttribute 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 探讨如何在Eclipse中过滤版本控制文件.svn

    探讨如何在Eclipse中过滤版本控制文件.svn

    本篇文章是对在Eclipse中过滤版本控制文件.svn的方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • Java Resource路径整理总结

    Java Resource路径整理总结

    这篇文章主要介绍了 Java Resource路径整理总结的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java8中Stream的详细使用方法大全

    Java8中Stream的详细使用方法大全

    Java8的另一大亮点Stream,它与java.io包里的InputStream和OutputStream是完全不同的概念,下面这篇文章主要给大家介绍了关于Java8中Stream详细使用方法的相关资料,需要的朋友可以参考下
    2022-06-06
  • Java 中的 BufferedReader 介绍_动力节点Java学院整理

    Java 中的 BufferedReader 介绍_动力节点Java学院整理

    BufferedReader 是缓冲字符输入流。它继承于Reader。接下来通过本文给大家介绍BufferedReader的相关知识,需要的朋友参考下吧
    2017-05-05
  • MyBatis无缝对接Spring的方法

    MyBatis无缝对接Spring的方法

    Spring框架与MyBatis框架是Java互联网技术的主流框架。那么mybatis如何无缝对接spring呢?下面通过本文给大家介绍,需要的的朋友参考下吧
    2017-09-09
  • java发送post请求使用multipart/form-data格式文件数据到接口代码示例

    java发送post请求使用multipart/form-data格式文件数据到接口代码示例

    这篇文章主要介绍了java发送post请求使用multipart/form-data格式文件数据到接口的相关资料,文中指定了数据编码格式为UTF-8,并强调了所需依赖工具类,需要的朋友可以参考下
    2024-12-12
  • java面试LruCache 和 LinkedHashMap及算法实现

    java面试LruCache 和 LinkedHashMap及算法实现

    这篇文章主要为大家介绍了java面试LruCache 和 LinkedHashMap及算法实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java将Object转换为数组的代码

    Java将Object转换为数组的代码

    这篇文章主要介绍了Java将Object转换为数组的情况,今天在使用一个别人写的工具类,这个工具类,主要是判空操作,包括集合、数组、Map等对象是否为空的操作,需要的朋友可以参考下
    2022-09-09
  • SpringBoot2.6.x 与 Swagger3 兼容问题及解决方法

    SpringBoot2.6.x 与 Swagger3 兼容问题及解决方法

    文章介绍了Spring Boot 2.6.x与Swagger 3兼容性问题的解决方法,如果项目中未引入spring-boot-starter-actuator,则在yml文件中加入相关配置,反之,需要添加其他配置,感兴趣的朋友一起看看吧
    2025-03-03
  • JavaWeb组件Servlet使用实例解析

    JavaWeb组件Servlet使用实例解析

    这篇文章主要介绍了JavaWeb组件Servlet使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论