/**
|
* BladeX Commercial License Agreement
|
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
|
* <p>
|
* Use of this software is governed by the Commercial License Agreement
|
* obtained after purchasing a license from BladeX.
|
* <p>
|
* 1. This software is for development use only under a valid license
|
* from BladeX.
|
* <p>
|
* 2. Redistribution of this software's source code to any third party
|
* without a commercial license is strictly prohibited.
|
* <p>
|
* 3. Licensees may copyright their own code but cannot use segments
|
* from this software for such purposes. Copyright of this software
|
* remains with BladeX.
|
* <p>
|
* Using this software signifies agreement to this License, and the software
|
* must not be used for illegal purposes.
|
* <p>
|
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
|
* not liable for any claims arising from secondary or illegal development.
|
* <p>
|
* Author: Chill Zhuang (bladejava@qq.com)
|
*/
|
package org.springblade.gateway.handler;
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import lombok.RequiredArgsConstructor;
|
import org.springblade.gateway.provider.ResponseProvider;
|
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
|
import org.springframework.core.annotation.Order;
|
import org.springframework.core.io.buffer.DataBufferFactory;
|
import org.springframework.http.MediaType;
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
import org.springframework.http.server.reactive.ServerHttpResponse;
|
import org.springframework.web.server.ResponseStatusException;
|
import org.springframework.web.server.ServerWebExchange;
|
import reactor.core.publisher.Mono;
|
|
import java.util.Map;
|
|
/**
|
* 异常处理
|
*
|
* @author Chill
|
*/
|
@Order(-1)
|
@RequiredArgsConstructor
|
public class ErrorExceptionHandler implements ErrorWebExceptionHandler {
|
|
private final ObjectMapper objectMapper;
|
|
@Override
|
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
|
ServerHttpRequest request = exchange.getRequest();
|
ServerHttpResponse response = exchange.getResponse();
|
|
if (response.isCommitted()) {
|
return Mono.error(ex);
|
}
|
|
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
|
if (ex instanceof ResponseStatusException) {
|
response.setStatusCode(((ResponseStatusException) ex).getStatusCode());
|
}
|
|
return response.writeWith(Mono.fromSupplier(() -> {
|
DataBufferFactory bufferFactory = response.bufferFactory();
|
try {
|
int status = 500;
|
if (response.getStatusCode() != null) {
|
status = response.getStatusCode().value();
|
}
|
Map<String, Object> result = ResponseProvider.response(status, this.buildMessage(request, ex));
|
return bufferFactory.wrap(objectMapper.writeValueAsBytes(result));
|
} catch (JsonProcessingException e) {
|
return bufferFactory.wrap(new byte[0]);
|
}
|
}));
|
}
|
|
|
/**
|
* 构建异常信息
|
*/
|
private String buildMessage(ServerHttpRequest request, Throwable ex) {
|
StringBuilder message = new StringBuilder("Failed to handle request [");
|
message.append(request.getMethod().name());
|
message.append(" ");
|
message.append(request.getURI());
|
message.append("]");
|
if (ex != null) {
|
message.append(": ");
|
message.append(ex.getMessage());
|
}
|
return message.toString();
|
}
|
|
}
|