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信息
在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;類的源碼