package com.fdkankan.gateway.exception; import com.fdkankan.common.constant.ServerCode; import com.fdkankan.common.exception.BusinessException; import org.springframework.boot.autoconfigure.web.ErrorProperties; import org.springframework.boot.autoconfigure.web.ResourceProperties; import org.springframework.boot.autoconfigure.web.reactive.error.DefaultErrorWebExceptionHandler; import org.springframework.boot.web.error.ErrorAttributeOptions; import org.springframework.boot.web.reactive.error.ErrorAttributes; import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.web.reactive.function.server.*; import java.util.Calendar; import java.util.HashMap; import java.util.Map; public class JsonErrorWebExceptionHandler extends DefaultErrorWebExceptionHandler { public JsonErrorWebExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties, ErrorProperties errorProperties, ApplicationContext applicationContext) { super(errorAttributes, resourceProperties, errorProperties, applicationContext); } @Override protected Map getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) { // 这里其实可以根据异常类型进行定制化逻辑 Throwable error = super.getError(request); Map errorAttributes = new HashMap<>(8); if(error instanceof BusinessException){ errorAttributes.put("code", ((BusinessException) error).getCode()); errorAttributes.put("message", ((BusinessException) error).getMessage()); }else{ errorAttributes.put("code", ServerCode.SYSTEM_ERROR.code()); errorAttributes.put("message", ServerCode.SYSTEM_ERROR.message()); } errorAttributes.put("method", request.methodName()); errorAttributes.put("path", request.path()); errorAttributes.put("timestamp", Calendar.getInstance().getTimeInMillis()); return errorAttributes; } @Override protected RouterFunction getRoutingFunction(ErrorAttributes errorAttributes) { return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse); } @Override protected int getHttpStatus(Map errorAttributes) { // 这里其实可以根据errorAttributes里面的属性定制HTTP响应码 return HttpStatus.INTERNAL_SERVER_ERROR.value(); } }