Controller接口还能这样玩

文摘   2024-12-03 08:00  

Spring Boot 3实战案例合集》现已囊括超过50篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

环境:SpringBoot3.2.5



1. 自己控制输出内容

接口参数可以直接使用OutputStream或Writer类型的参数,这样你的接口可以不用有任何的返回值,直接通过这2个对象进行输出内容,如下示例:

@GetMapping("/index")public void index(OutputStream os, HttpServletResponse response) throws Exception {  response.setContentType("text/plain;charset=utf-8") ;  os.write("中国🇨🇳".getBytes()) ;}

输出结果

2. 自行读取请求body

当你需要自己解析处理请求body内容时,你可以将参数定义为InputStream或Reader类型,如下示例:

@PostMapping("/index")public void index(InputStream is, HttpServletResponse response) throws Exception {  response.setContentType("application/json;charset=utf-8") ;  StringBuilder sb = new StringBuilder() ;  String line = null ;  InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8) ;  BufferedReader br = new BufferedReader(isr) ;  while ((line = br.readLine()) != null) {    sb.append(line) ;  }  response.getWriter().println(sb.toString()) ;}

输出结果

3. 表达式参数

通常接口参数都是用来接收用户输入的数据,不过你还可以将参数值"固定"了,通过@Value注解来获取配置的数据信息,如下示例:

@GetMapping("/index")public Object index(  @Value("${pack.controller.params.version:}") String version) {  return version ;}

配置文件

pack:  controller:    params:      version: 1.0.1

输出结果

即便请求参数中有version参数值也不会影响接口。

你甚至还可以使用SpEL表达式

@GetMapping("/spel")public Object spel(@Value("#{systemProperties['java.home']}") String javaHome) {  return javaHome ;}

输出结果

4. body与header一起获取

如果你不仅要获取请求body还希望获取所有逇请求header信息,那么你可以将参数类型定义为HttpEntity类型,如下示例:

@PostMapping("/index")public Object index(HttpEntity<User> entity) {  System.out.printf("headers: %s%n", entity.getHeaders()) ;  return entity.getBody() ;}public static record User(Long id, String name) {}

请求

控制台输出

5. 从当前安全上下文中获取指定数据

这需要你当前环境使用了Spring Security。你可以直接在参数中获取SecurityContext对象,也可以获取当前安全上下文的任何关联对象,比如获取当前登录人的name或者获取角色信息等,如下示例:

@GetMapping("/name")public Object name(  @CurrentSecurityContext(expression = "authentication.name") String name) {  return name ;}

这里将获取当前登录用户的name属性值。

注:@CurrentSecurityContext注解从5.2版本才有的。

通过如下表达式还能获取当前的角色信息

@CurrentSecurityContext(expression = "authentication.authorities")

当然你也可以直接获取当前的上下文对象

@CurrentSecurityContext SecurityContext context

不添加表达式属性即可获取当前安全上下文对象。

获取角色信息。

6. 特殊的Map参数

你可以在参数中直接定义Map集合对象;而它并非是从请求中获取所有的参数添加到Map,而是从模型属性中获取,如下示例:

// 由该注解来接收用户请求的参数@ModelAttribute("user")public User init(User user) {  return user ;}@GetMapping("/index")public Object index(Map<String, Object> map) {  // 获取用户输入的参数  return map.get("user") ;}

输出结果

这里Map填充的是由@ModelAttribute标注方法设置的值。

以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

别不信@PathVariable你真不会用

我100%确定,你对@ComponentScan注解的了解仅限于皮毛

强化学习!Spring Boot自定义注解实现静态字段的注入,支持任意类型

优雅!Spring Boot 一个注解轻松实现敏感词检查,支持多场景

基于 Spring Boot 玩转JPA各种锁的应用(乐观锁,悲观锁)

自己动手实现精简版SpringBoot原来如此简单

强大!非常实用的Spring Boot动态功能切换

手写!Controller接口性能监控

SpringBoot @Value注解这些高级玩法用过吗?

当心!SpringBoot在以下几种情况将导致代理失效

实战!16条SpringBoot Web服务配置指南及优化技巧

10个SpringBoot开发技能,每个都很实用(一)

强大!实时监控SpringBoot运行时状态及应用运行时信息(数据库, Redis,MQ等)

SpringBoot这几个工具类太有用了

Java高级开发必须掌握JMH进行性能测试优化

分类整理SpringBoot核心注解及应用

严重!Spring AOP Bug导致切面重复执行

SpringBoot强大的数据格式化功能

线上故障!手贱导致事务失效

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章