在springcloud中,网关发生异常时,我们需要自定义返回的异常信息给用户看
那么我们就需要自定义异常过滤器了
首先我们需要停用内置的默认异常处理器SendErrorFilter,不然还是走的他默认的异常过滤器
在yml中的配置为:
zuul:
SendErrorFilter:
error:
disable: true
可以继承SendErrorFilter 类,也可以继承ZuulFilter类,实现结果都一样
package com.qiangqiang.filter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* \* Created with IntelliJ IDEA.
* \* @author: xiyue
* \* Date: 2021/1/12
* \* Time: 13:16
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
@Component
public class CustomSendErrorFilter extends SendErrorFilter {
@Override
public String filterType() {
return super.filterType();
}
@Override
public int filterOrder() {
return super.filterOrder();
}
@Override
public boolean shouldFilter() {
return super.shouldFilter();
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletResponse response = ctx.getResponse();
try {
int responseStatusCode = ctx.getResponseStatusCode();
// 此处自定义响应体start
String cumstomBody = "{当前服务出现异常}";//内容省略...
// 此处自定义响应体end
response.setStatus(ctx.getResponseStatusCode());
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
response.getOutputStream().write(cumstomBody.getBytes());
} catch (IOException e) {
ReflectionUtils.rethrowRuntimeException(e);
}
return null;
}
}