123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 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<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {
- // 这里其实可以根据异常类型进行定制化逻辑
- Throwable error = super.getError(request);
- Map<String, Object> 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<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
- return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse);
- }
- @Override
- protected int getHttpStatus(Map<String, Object> errorAttributes) {
- // 这里其实可以根据errorAttributes里面的属性定制HTTP响应码
- return HttpStatus.INTERNAL_SERVER_ERROR.value();
- }
- }
|