直接上代码,一共需要写3个类:

处理json异常消息的类:

import org.reactivestreams.Publisher;
import org.springframework.core.ResolvableType;
import org.springframework.http.MediaType;
import org.springframework.http.ReactiveHttpOutputMessage;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;import java.util.Collections;
import java.util.List;
import java.util.Map;/*** @author itning* @date 2019/4/29 19:07*/
@Component
public class JsonHttpMessageWriter implements HttpMessageWriter<Map<String, Object>> {@NonNull@Overridepublic List<MediaType> getWritableMediaTypes() {return Collections.singletonList(MediaType.APPLICATION_JSON_UTF8);}@Overridepublic boolean canWrite(@NonNull ResolvableType elementType, MediaType mediaType) {return MediaType.APPLICATION_JSON.includes(mediaType);}@NonNull@Overridepublic Mono<Void> write(@NonNull Publisher<? extends Map<String, Object>> inputStream,@NonNull ResolvableType elementType,MediaType mediaType,@NonNull ReactiveHttpOutputMessage message,@NonNull Map<String, Object> hints) {return Mono.from(inputStream).flatMap(m -> message.writeWith(Mono.just(message.bufferFactory().wrap(transform2Json(m).getBytes()))));}private String transform2Json(Map<String, Object> sourceMap) {return "{" +"\"code\":" +sourceMap.getOrDefault("code", 500) +"," +"\"msg\":\"" +sourceMap.getOrDefault("msg", "") +"\"," +"\"data\":\"" +sourceMap.getOrDefault("data", "") +"\"}";}
}
复制代码

设置错误消息Map集合:

import org.springframework.boot.web.reactive.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.server.ResponseStatusException;import java.util.LinkedHashMap;
import java.util.Map;/*** @author itning* @date 2019/4/29 18:11*/
@Component
public class GlobalErrorAttributes extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(ServerRequest request, boolean includeStackTrace) {Throwable error = getError(request);if (error instanceof ResponseStatusException) {ResponseStatusException responseStatusException = (ResponseStatusException) error;Map<String, Object> errorAttributes = new LinkedHashMap<>();errorAttributes.put("code", responseStatusException.getStatus().value());errorAttributes.put("msg", responseStatusException.getMessage());errorAttributes.put("data", "");return errorAttributes;} else {Map<String, Object> errorAttributes = super.getErrorAttributes(request, includeStackTrace);errorAttributes.put("code", errorAttributes.getOrDefault("status", 404));errorAttributes.put("msg", error.getMessage());errorAttributes.put("data", "");return errorAttributes;}}
}
复制代码

错误处理:

import org.springframework.boot.autoconfigure.web.ResourceProperties;
import org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler;
import org.springframework.boot.web.reactive.error.ErrorAttributes;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.*;
import reactor.core.publisher.Mono;import java.util.Collections;
import java.util.Map;/*** @author itning* @date 2019/4/29 18:13*/
@Component
@Order(-2)
public class GlobalErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {public GlobalErrorWebExceptionHandler(JsonHttpMessageWriter jsonHttpMessageWriter,ErrorAttributes errorAttributes,ResourceProperties resourceProperties,ApplicationContext applicationContext) {super(errorAttributes, resourceProperties, applicationContext);setMessageWriters(Collections.singletonList(jsonHttpMessageWriter));}@Overrideprotected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse);}private Mono<ServerResponse> renderErrorResponse(ServerRequest request) {Map<String, Object> errorPropertiesMap = getErrorAttributes(request, false);return ServerResponse.status(Integer.valueOf(errorPropertiesMap.getOrDefault("code", 500).toString())).contentType(MediaType.APPLICATION_JSON_UTF8).body(BodyInserters.fromObject(errorPropertiesMap));}
}
复制代码

Spring Boot WebFlux 全局异常处理(404,500)解决IllegalArgumentException: Property 'message...相关推荐

  1. Spring Boot入门——全局异常处理

    Spring Boot入门--全局异常处理 参考文章: (1)Spring Boot入门--全局异常处理 (2)https://www.cnblogs.com/studyDetail/p/702758 ...

  2. 从零开始学习springmvc(5)——Spring国际化和全局异常处理

    [项目地址] 从零开始学习springmvc 如果觉得有用可以关注一下公众号:码字不易,求赞求关注 五.Spring国际化和全局异常处理 五.Spring国际化和全局异常处理 5.1 国际化介绍 5. ...

  3. Spring Boot WebFlux 上手教程

    Spring Boot WebFlux 上手教程 背景 大家都知道,Spring Framework 是 Java/Spring 应用程序跨平台开发框架,也是 Java EE(Java Enterpr ...

  4. 基于spring boot的统一异常处理

    基于spring boot的统一异常处理 参考文章: (1)基于spring boot的统一异常处理 (2)https://www.cnblogs.com/knyel/p/7804237.html 备 ...

  5. Spring Boot学习——统一异常处理

    Spring Boot学习--统一异常处理 参考文章: (1)Spring Boot学习--统一异常处理 (2)https://www.cnblogs.com/aston/p/7258834.html ...

  6. Spring Boot 2.X 如何优雅的解决跨域问题?

    Spring Boot 2.X 如何优雅的解决跨域问题? 参考文章: (1)Spring Boot 2.X 如何优雅的解决跨域问题? (2)https://www.cnblogs.com/haha12 ...

  7. Spring Boot自动化配置的利弊及解决之道

    Spring Boot中的双刃剑:自动化配置 在之前发布的Spring Boot基础教程系列文章中,我们通过各种功能性示例体验了Spring Boot的自动化配置给我们所带来的超便利的新开发方式.但是 ...

  8. 亲测有效:spring boot中parent节点报错解决办法

    今天中午开始学习spring boot,结果一中午都卡在了pom.xml配置上.因为spring boot需要引入一个parent project, pom.xml文件中: <!-- Inher ...

  9. Spring MVC设置首页,403,404,500页面

    一.设置首页 1.静态页面 设置静态页面相对简单,直接在项目的web.xml定义如下即可: <web-app> ... <welcome-file-list><welco ...

最新文章

  1. 【Flink】Flink kafka producer 分区策略 (flink写入数据不均匀 与 数据写入 分区无数据 )
  2. mysql数据库的函数_详解数据库_MySQL: mysql函数
  3. Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动
  4. ubuntu下lvs负载均衡dr模型shell脚本
  5. 赚钱第一,投资第二,才是正确的财富获取方式
  6. 机器学习——异常值检测
  7. 【NOIP2015】【Luogu2678】跳石头
  8. Linux格式化分区报错Could not start /dev/sda No such file or directory 解决办法
  9. 对付U盘病毒彻底免疫
  10. IE6——png图片的修复
  11. 解决jupyter notebook报错500的问题
  12. java jui_求教java大神,下面这个JUI界面是怎么布局而成的
  13. android 没有menu菜单键,android之onCreateOptionsMenu失效,按菜单键无反应
  14. linux如何把文件导出到ftp,Linux如何利用ssh传送文件至FTP空间
  15. 【第一组】第三次冲刺例会
  16. 实话谈扶贫第一篇——教育扶贫
  17. 【活动回顾】上海区块链开发者大会(2021)第二日精彩回顾
  18. 数据结构与算法java - 03 链表,单向链表,逆序打印单向链表
  19. OpenCV开发笔记(五十一):红胖子8分钟带你深入了解透视变换(图文并茂+浅显易懂+程序源码)
  20. 解决 `Failed to connect to github.com port 443: Connection refused`

热门文章

  1. Egret之龙骨卡槽(slot)换皮
  2. Jquery源码分析之匿名函数的自执行
  3. maven pom.xml 报错
  4. iOS - UnitTests 单元测试
  5. Java遇见HTML——JSP篇之JSP指令与动作元素
  6. Java基础系列:(2)关于枚举的简单总结
  7. iOS 十六进制的颜色值转换为UIColor
  8. boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转
  9. wordpress 重新生成附件文件名
  10. 浅谈使用openwave测试的几个注意项