两种方式
1.自定义error错误页面
/**
* 自定义error错误页面
* @author zhiguang
*/
@RestController
public class ErrorHandlerController implements ErrorController {
/**
* 出异常后进入该方法,交由下面的方法处理
*/
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping("/error")
public Object error(){
RequestContext ctx = RequestContext.getCurrentContext();
ZuulException exception = (ZuulException)ctx.getThrowable();
return Result.choose(exception.nStatusCode, exception.getMessage());
}
}
我这里是返回的json信息
2.禁用zuul默认的异常处理filter---SendErrorFilter
在yml中设置
zuul:
SendErrorFilter:
error:
disable:true
然后自定义errorfilter
public class ErrorFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(ErrorFilter.class);
@Override
public String filterType() {
return "error";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
try {
RequestContext context = RequestContext.getCurrentContext();
ZuulException exception = this.findZuulException(context.getThrowable());
logger.error("进入系统异常拦截", exception);
HttpServletResponse response = context.getResponse();
response.setContentType("application/json; charset=utf8");
response.setStatus(exception.nStatusCode);
PrintWriter writer = null;
try {
writer = response.getWriter();
writer.print("{code:"+ exception.nStatusCode +",message:\""+ exception.getMessage() +"\"}");
} catch (IOException e) {
e.printStackTrace();
} finally {
if(writer!=null){
writer.close();
}
}
} catch (Exception var5) {
ReflectionUtils.rethrowRuntimeException(var5);
}
return null;
}
ZuulException findZuulException(Throwable throwable) {
if (ZuulRuntimeException.class.isInstance(throwable.getCause())) {
return (ZuulException)throwable.getCause().getCause();
} else if (ZuulException.class.isInstance(throwable.getCause())) {
return (ZuulException)throwable.getCause();
} else {
return ZuulException.class.isInstance(throwable) ? (ZuulException)throwable : new ZuulException(throwable, 500, (String)null);
}
}
}
可以看看SendErrorFilter这个类的源码,这是zuul的默认异常处理类
今天处理异常发现404不走过滤器
还是走的errorcontroller
/**
* 自定义error错误页面
* @author zhiguang
*/
@RestController
public class ErrorHandlerController implements ErrorController {
/**
* 出异常后进入该方法,交由下面的方法处理
*/
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping("/error")
public Object error(HttpServletRequest request, HttpServletResponse response){
//
/*RequestContext ctx = RequestContext.getCurrentContext();
ZuulException exception = (ZuulException)ctx.getThrowable();
return Result.choose(exception.nStatusCode, exception.getMessage());*/
Integer status = (Integer)request.getAttribute("javax.servlet.error.status_code");
return Result.choose(status, status == 404 ? "访问地址不存在" : "内部服务器错误,正在处理");
}
}
可以查看BasicErrorController;类的源码
网友评论