900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Spring Boot WebFlux 全局异常处理(404 500)解决IllegalArgumentException: Property 'message...

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

时间:2021-02-23 21:50:55

相关推荐

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

直接上代码,一共需要写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.ponent;import reactor.core.publisher.Mono;import java.util.Collections;import java.util.List;import java.util.Map;/*** @author itning* @date /4/29 19:07*/@Componentpublic 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.ponent;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 /4/29 18:11*/@Componentpublic 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.ponent;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 /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));}}复制代码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。