欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 为了简单起见,本篇不再新增maven子工程,而是基于前文创建的子工程gateway-change-body,在这里面继续写代码;

源码下载

名称 链接 备注
项目主页 https://github.com/zq2599/blog_demos 该项目在GitHub上的主页
git仓库地址(https) https://github.com/zq2599/blog_demos.git 该项目源码的仓库地址,https协议
git仓库地址(ssh) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
  • 这个git项目中有多个文件夹,本篇的源码在spring-cloud-tutorials文件夹下,如下图红框所示:

  • spring-cloud-tutorials文件夹下有多个子工程,本篇的代码是gateway-change-body,如下图红框所示:

第一种:抛出ResponseStatusException异常

  • 打开gateway-change-body工程的RequestBodyRewrite.java文件,改动如下图红框,如果请求body不含user-id参数就返回Mono.error,入参是ResponseStatusException异常,设置了返回码为400,message为一段中文描述:

  • 接下来运行nacos、provider-hello工程、gateway-change-body工程

  • 用postman发请求试试,请求和响应的详情如下图:

  • 从上图可见,返回码为400,和我们设定的一样,但是message却为空,这是怎么回事呢?按照咱们的设定,这里应该显示请求参数必须包含user-id字段,看来咱们遇到一只拦路虎了

小小拦路虎

  • 咱们代码中,抛异常的时候设定message内容如下图红框所示,但运行的时候返回的是空字符串,这是怎么回事呢?

  • 来看DefaultErrorWebExceptionHandler.isIncludeMessage方法,看下图红框中的那个errorProperties,您会不会恍然大悟:这不就是springboot配置中的erro配置嘛!

  • 修改工程的配置文件,红框内是新增的配置:

  • 再用postman试试,如下图,这一次,status、message、exception、trace齐聚一堂,完全符合预期:

  • 看来第一种方法是可行的:返回ResponseStatusException类型的异常;

第二种:自定义异常,带ResponseStatus注解

  • 接下来试试第二种方法:通ResponseStatus注解

  • 首先新建一个异常类MyGatewayException.java,使用了ResponseStatus,在里面配置返回码和message内容,这次的返回码用的是403:

package com.bolingcavalry.changebody.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(code = HttpStatus.FORBIDDEN, reason = "user-id字段不能为空")
public class MyGatewayException extends Exception {
}
  • 编码完成,重启应用,然后再发一次请求,如下图,返回码和message内容都符合预期:

  • 至此,两种最简单的方式都完成验证,一般情况下已经满足要求:将错误信息准确传递给调用方

留有瑕疵

  • 聪明的您应该已发现上述两种方案有瑕疵:返回body的格式和字段都是固定的,如果项目中对返回body的内容有严格要求,例如只允许code、message、data三个字段,其余字段一律不能返回,此时又该怎么办呢?

  • 似乎需要一种方法,让咱们可以随心所欲的设置body内容,篇幅所限,这种终极的解决方式就留在下一篇吧,敬请期待,欣宸原创,必不辜负您...

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...

https://github.com/zq2599/blog_demos

Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)的更多相关文章

  1. Spring Cloud Gateway过滤器精确控制异常返回(实战,完全定制返回body)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 Spring Cloud Gateway应用 ...

  2. Spring Cloud Gateway过滤器精确控制异常返回(分析篇)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 在<Spring Cloud Gate ...

  3. Spring Cloud Gateway之全局异常拦截器

    /** * @version 2019/8/14 * @description: 异常拦截器 * @modified: */ @Slf4j public class JsonExceptionHand ...

  4. Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制

    一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...

  5. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

  6. Spring Cloud Gateway 网关限流

    Spring Cloud Gateway 限流 一.背景 二.实现功能 三.网关层限流 1.使用默认的redis来限流 1.引入jar包 2.编写配置文件 3.网关正常响应 4.网关限流响应 2.自定 ...

  7. Spring Cloud Gateway自定义过滤器实战(观测断路器状态变化)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...

  9. Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

随机推荐

  1. 互联网公司作息表「GitHub 热点速览 v.21.42」

    作者:HelloGitHub-小鱼干 检测一家公司是否值得一去,除了高薪之外,还有时薪的算法.即便是同样的时薪,在一家能随时摸鱼的公司,岂不是人生快事.WorkingTime 便是上周很火的互联网作息 ...

  2. docker初探和基础搭建

    个人博客 docker中文手册 Docker 是什么? docker是一个开源的软件部署解决方案: docker也是轻量级的应用容器框架: docker可以打包.发布.运行任何的应用. 在我的粗浅理解 ...

  3. 【UE4 C++】简单获取名称、状态、时间、帧数、路径与FPaths

    基于UKismetSystemLibrary 获取各类名称 // Returns the actual object name. UFUNCTION(BlueprintPure, Category = ...

  4. django 中的hello word 开心,通过申请博客了,,发个随笔庆祝一下~~~~~~~

    django 中的hello word! 准备:[pymsql,pycharm,django3.0.7] >>>终端中:django-admin.py startproject [项 ...

  5. 人人都写过的5个Bug!

    大家好,我是良许. 计算机专业的小伙伴,在学校期间一定学过 C 语言.它是众多高级语言的鼻祖,深入学习这门语言会对计算机原理.操作系统.内存管理等等底层相关的知识会有更深入的了解,所以我在直播的时候, ...

  6. Java并发:AbstractQueuedSynchronizer(AQS)

    队列同步器 AbstractQueuedSynchronizer 是一个公共抽象类.提供一个同步器框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等).使用一个 in ...

  7. Spring Cache 带你飞(一)

    Spring 3.1 版本引入基于 annotation 的 cache 技术,提供了一套抽象的缓存实现方案,通过注解方式使用缓存,基于配置的方式灵活使用不同缓存组件.代码具有相当的灵活性和扩展性,本 ...

  8. 数组中重复的数字 牛客网 剑指Offer

    数组中重复的数字 牛客网 剑指Offer 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中 ...

  9. 接口自动化 - pytest-fixture -scope作用范围

            接口自动化-pytest中的fixture - scope                介绍 fixture文章中介绍的比较少,同学们可以去搜索下fixture的详解或者去看看源码 ...

  10. jquery 实现 <imput>标签 密码框显示/隐藏密码功能

    1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 < ...