java程序服务重启前端要求返回一个信息而不是一个报错信息如何优化

提示: 本文章只适用于微服务架构,如果是传统服务或者没有用到网关的服务不适合使用动生成,如何生成可参考右边的帮助文档


前言

本文章只适用于微服务架构,如果是传统服务或者没有用到网关的服务不适合使用


一、为什么要这么做

操作人员不知道我们开发的逻辑,也看不懂我们的报错信息,以为报错了就是程序错误,导致用户使用很差

二、操作步骤

1.首先要找到项目中的网关层,我们要明白我们项目重启之后,数据请求到我们的项目中,网关就会根据请求路径会请求到我们项目中,项目没有正常启动,这时候会报错,所以我们处理的思路就是,根据这个报错类型在网关创建一个全局处理异常的类,当我们的项目报错,然后在根据我们的请求路径封装相关的返回数据,给前端一个用户能看得懂的异常报错;

代码如下(示例):

import com.alibaba.fastjson.JSON;
import com.nbport.modetest.gateway.domain.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.cloud.gateway.support.NotFoundException;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 网关统一异常处理
 *
 * @author yanpu
 */
@Order(-1)
@Configuration
public class GatewayExceptionHandler implements ErrorWebExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class);

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        ServerHttpResponse response = exchange.getResponse();

        if (exchange.getResponse().isCommitted()) {
            return Mono.error(ex);
        }

        String msg;

        if (ex instanceof NotFoundException) {
            msg = "服务维护中," + ((NotFoundException) ex).getReason();
        } else if (ex instanceof ResponseStatusException) {
            ResponseStatusException responseStatusException = (ResponseStatusException) ex;
            msg = responseStatusException.getMessage();
        } else {
            msg = "内部服务器错误";
        }

        log.error("[网关异常处理]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), ex.getMessage());

        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
        response.setStatusCode(HttpStatus.OK);

        return response.writeWith(Mono.fromSupplier(() -> {
            DataBufferFactory bufferFactory = response.bufferFactory();
            return bufferFactory.wrap(JSON.toJSONBytes(R.error(msg)));
        }));
    }
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了网关异常的使用,如果大家还有问题,可以在评论区留言或者私信,看到之后我会回应大家

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值