spring通过filter,Interceptor统一处理ResponseBody的返回值操作

项目中有一个需求,需要统一处理一下@ResponseBody注解的返回值(比如打印),在网上找了一下,有建议用AOP来做的,但是个人认为项目中用多个AOP并不优雅;通过google,找到了spring的ResponseBodyAdvice接口,用来对返回体做统一处理。

例如:统一打印返回体中的内容

@ControllerAdvice(basePackages = "cc.openwiki.controller.biz")
public class LogResponseAdvice implements ResponseBodyAdvice<Object> {
 @Override
 public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
  return true;
 }

 @Override
 public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
  log.info("返回值为:{}", JSON.toJSONString(body));
  return body;
 }

补充知识:Spring mvc中统一对ResponseBody进行封装

在一个前后端分离的项目中,需要对后端RestController里返回的ResponseBody进行统一的封装,让所有的API结果的都是json对象,带有是否成功的标志位,并且将实际的数据放到json的result字段中,例如:

{"result":["age","height"],"success":true}

如果在每个RestController中进行封装,重复的工作很多,因此需要自动封装,比如已经写好了如下Controller

@RestController()
@RequestMapping("bar")
public class BarController {

 @GetMapping("foo")
 public List<String> getSessionColumns() {
  List<String> result = new ArrayList<>();
  result.add("age");
  result.add("height");
  return result;
 }
}

自动将结果封装为

{"result":["age","height"],"success":true}

一开始试验了AOP,但是发现总是有ClassCastException的问题,后来又找到了ResponseBodyAdvice,才解决这个问题

public class NovaResponseBodyAdvice implements ResponseBodyAdvice {
 @Override
 public boolean supports(MethodParameter returnType, Class converterType) {
  return true;
 }

 @Override
 public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
         Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
  Map<String, Object> result = new HashMap<>();
  result.put("result", body);
  result.put("success", true);
  return result;
 }
}

以上这篇spring通过filter,Interceptor统一处理ResponseBody的返回值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Springboot引入拦截器并放行swagger代码实例

    这篇文章主要介绍了Springboot引入拦截器并放行swagger代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Springboot引入拦截器 自定义的拦截器类 Interceptor package cn.zytao.taosir.auth.config; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import j

  • 详解SpringBoot中异步请求和异步调用(看完这一篇就够了)

    一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应.一句话:增加了服务器对客户端请求的吞吐量(实际生产上我们用的比较少,如果并发请求量很大的情况下,我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力,当然还可以通过消息队列来做请求的缓冲). 2.异步请求的实现 方式一:Servlet方式实现异步请求

  • Java使用@Validated注解进行参数验证的方法

    目前项目中大部分代码进行参数验证都是写代码进行验证,为了提升方便性和代码的简洁性,所以整理了下使用注解进行参数验证.使用效果如下: // 要验证的实体类 @Data public class User implements Serializable { @NotBlank(message = "id不能为空!",groups = Update.class) protected String id = ""; @NotBlank(message = "商户i

  • spring通过filter,Interceptor统一处理ResponseBody的返回值操作

    项目中有一个需求,需要统一处理一下@ResponseBody注解的返回值(比如打印),在网上找了一下,有建议用AOP来做的,但是个人认为项目中用多个AOP并不优雅:通过google,找到了spring的ResponseBodyAdvice接口,用来对返回体做统一处理. 例如:统一打印返回体中的内容 @ControllerAdvice(basePackages = "cc.openwiki.controller.biz") public class LogResponseAdvice i

  • Spring实战之获取方法返回值操作示例

    本文实例讲述了Spring实战之获取方法返回值操作.分享给大家供大家参考,具体如下: 一 配置文件 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:

  • Spring实战之使用Expression接口进行表达式求值操作示例

    本文实例讲述了Spring使用Expression接口进行表达式求值操作.分享给大家供大家参考,具体如下: 一 Bean package org.crazyit.app.domain; import java.util.Date; public class Person { private Integer id; private String name; private Date birth; // 无参数的构造器 public Person() { } // 初始化全部成员变量的构造器 pub

  • Spring boot Jpa添加对象字段使用数据库默认值操作

    目录 项目搭建 代码 配置文件 spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.

  • Spring boot Jpa添加对象字段使用数据库默认值操作

    目录 项目搭建 错误测试 解决问题 jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其余字段用数据库默认值,要是直接用idea生成实体类操作的话会报SQLIntegrityConstraintViolationException异常,我们需要jpa根据传入的对象存在的属性动态生成更新和添加语句需要给实体类添加@DynamicUpdate,@DynamicInsert根据对象属性生成动态update和inse

  • Spring Cloud zuul自定义统一异常处理实现方法

    Zuul在springcloud微服务体系中提供filer和router功能,是微服务不可或缺的部分.filer处理默认实现的外还可以自定义进行授权.限流.安全校验等,router完全可以替代Nginx反向代理.Zuul异常处理就是由SendErrorFilter完成. 在我们应用过程我们发现使用默认的异常filter有两个问题不是很友好: 1.无法快速识别出是否是请求路由的服务超时还是没有任何可用节点,发生错误只能查看日志通过堆栈去定位: 2.无法兼容自定义的譬如{code:500,msg:"

  • zuulGateway 通过filter统一修改返回值的操作

    使用spring cloud有时候我们给客户端返回内容的时候,往往需要添加一些额外的东西.比如加密,多添加一个返回值等等. 当然可以在方法里面处理,但如果方法很多,需要统一处理的,就很不方便了,这时候可以通过zuulGateway的filter来统一处理. 直接看代码,很简单: import java.io.InputStream; import java.nio.charset.Charset; import org.springframework.cloud.netflix.zuul.fil

  • vue实现的封装全局filter并统一管理操作示例

    本文实例讲述了vue实现的封装全局filter并统一管理操作.分享给大家供大家参考,具体如下: 在前后端分离的项目中,经常会有后台返回的数据需要进过处理才能显示到页面上的场景. 使用最多的场景就是日期和时间的处理,后台一般返回的都是时间戳,那么我们就要对时间戳进行处理. 下面就拿封装全局的处理日期和时间的 filter 来展示如何 vue 如何封装全局 filter 并统一处理. 在 src 目录下新建 filters 目录用来专门存放全局过滤器,如果项目的过滤器过多,那么就要按类型分类. 我司

  • Spring Boot 捕捉全局异常 统一返回值的问题

    在前后端分离的情况下,我们经常会定义一个统一的反回数据格式,通常都会包含状态码,返回信息,返回的数据,是否成功等参数. 1.ResultCode 单独定义了一个ReturnCode枚举类用于存储代码和返回的Message public enum ResultCode { //成功 SUCCESS(200), // 失败 FAIL(400), // 未认证(签名错误) UNAUTHORIZED(401), // 接口不存在 NOT_FOUND(404), // 服务器内部错误 INTERNAL_S

  • Spring下Filter过滤器配置全局异常处理的详细步骤

    Spring下Filter过滤器配置全局异常处理 Filter中出现的异常,spring的全局异常处理器是无法捕获的,所以filter拦截器中出现的异常会直接的抛向浏览器,在浏览器中显示500错误. 而我当前的项目中,是在Filter中判断用户是否有携带Token访问,如果没有,则抛出异常,让其做登录操作.而且异常信息要处理成json格式返回给前端.这就很尴尬了. 好了废话说多了,上解决方案: 结局方案: Filter拦截器中直接抛出异常信息 @Component public class Ad

随机推荐