Parcourir la source

新增网关异常自定义

赵冬冬 il y a 4 ans
Parent
commit
8eb7b6f0e8
17 fichiers modifiés avec 282 ajouts et 38 suppressions
  1. 16 0
      forest-admin/admin-mbg/pom.xml
  2. 6 3
      forest-admin/admin-mbg/src/main/java/com/hwrj/cloud/admin/model/PmsProduct.java
  3. 10 4
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/controller/PmsProductController.java
  4. 2 1
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/controller/UmsCompanyController.java
  5. 12 12
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/controller/UmsMemberOriginController.java
  6. 3 1
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dao/UmsCompanyInfoDao.java
  7. 2 1
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dto/UmsMemberOriginParam.java
  8. 9 0
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dto/param/SelectNewVo.java
  9. 2 1
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/service/UmsCompanyService.java
  10. 7 7
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/service/impl/PmsProductServiceImpl.java
  11. 3 0
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/service/impl/UmsAdminServiceImpl.java
  12. 12 2
      forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/service/impl/UmsCompanyInfoServiceImpl.java
  13. 1 3
      forest-admin/admin-server/src/main/resources/dao/ProductExcelDao.xml
  14. 6 3
      forest-admin/admin-server/src/main/resources/dao/UmsCompanyInfoDao.xml
  15. 40 0
      forest-gateway/src/main/java/com/hwrj/cloud/gateway/config/AbstractExceptionHandler.java
  16. 35 0
      forest-gateway/src/main/java/com/hwrj/cloud/gateway/config/GatewayExceptionConfig.java
  17. 116 0
      forest-gateway/src/main/java/com/hwrj/cloud/gateway/config/GatewayExceptionHandler.java

+ 16 - 0
forest-admin/admin-mbg/pom.xml

@@ -30,6 +30,22 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>
     </dependencies>
 
 

+ 6 - 3
forest-admin/admin-mbg/src/main/java/com/hwrj/cloud/admin/model/PmsProduct.java

@@ -1,5 +1,7 @@
 package com.hwrj.cloud.admin.model;
 
+
+import javax.validation.constraints.NotNull;
 import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -10,13 +12,13 @@ public class PmsProduct implements Serializable {
 
     @ApiModelProperty(value = "品牌id")
     private Long brandId;
-
+    @NotNull(message="产品大类id不能为空")
     @ApiModelProperty(value = "产品大类标识")
     private Long productBigCategoryId;
 
     @ApiModelProperty(value = "产品大类类别名称")
     private String productBigCategoryName;
-
+    @NotNull(message="产品小类id不能为空")
     @ApiModelProperty(value = "产品类别标识")
     private Long productCategoryId;
 
@@ -112,7 +114,7 @@ public class PmsProduct implements Serializable {
 
     @ApiModelProperty(value = "品牌名称")
     private String brandName;
-
+    @NotNull(message="供应商id不能为空")
     @ApiModelProperty(value = "供应商id")
     private Long compId;
 
@@ -128,6 +130,7 @@ public class PmsProduct implements Serializable {
     @ApiModelProperty(value = "生产日期")
     private String dateOfManufacture;
 
+    @NotNull(message="供应商id不能为空")
     @ApiModelProperty(value = "生产地id")
     private Long placeOfProductionId;
 

+ 10 - 4
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/controller/PmsProductController.java

@@ -19,7 +19,9 @@ import com.hwrj.cloud.common.api.CommonResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
 import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -41,7 +43,7 @@ public class PmsProductController {
     @ApiOperation("创建商品")
     @RequestMapping(value = "/create", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult create(@RequestBody com.hwrj.cloud.admin.dto.PmsProductParam productParam, BindingResult bindingResult) {
+    public CommonResult create(@Validated @RequestBody com.hwrj.cloud.admin.dto.PmsProductParam productParam, BindingResult bindingResult) {
         int count = productService.create(productParam);
         if (count > 0) {
             return CommonResult.success(count);
@@ -61,7 +63,7 @@ public class PmsProductController {
     @ApiOperation("更新商品")
     @RequestMapping(value = "/update/{id}", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult update(@PathVariable Long id, @RequestBody com.hwrj.cloud.admin.dto.PmsProductParam productParam, BindingResult bindingResult) {
+    public CommonResult update(@PathVariable Long id, @Validated @RequestBody com.hwrj.cloud.admin.dto.PmsProductParam productParam, BindingResult bindingResult) {
 
         int count = productService.update(id, productParam);
         if (count > 0) {
@@ -74,8 +76,12 @@ public class PmsProductController {
     @ApiOperation("根据供应商选择生产地")
     @GetMapping(value = "/plOfPro/select")
     @ResponseBody
-    public CommonResult plOfProSelect() {
-        List<SelectVo> plOfProSelect = productService.plOfProSelect(CurrUserUtil.getCompId());
+    public CommonResult plOfProSelect(@RequestParam(value = "compId",required = false) Long compId) {
+
+        if(StringUtils.isEmpty(compId)){
+            compId = CurrUserUtil.getCompIdInfo();
+        }
+        List<SelectVo> plOfProSelect = productService.plOfProSelect(compId);
         return CommonResult.success(plOfProSelect);
     }
 

+ 2 - 1
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/controller/UmsCompanyController.java

@@ -3,6 +3,7 @@ package com.hwrj.cloud.admin.controller;
 
 import com.hwrj.cloud.admin.dto.UmsCompanyDto;
 import com.hwrj.cloud.admin.dto.param.CompanyWebPageParam;
+import com.hwrj.cloud.admin.dto.param.SelectNewVo;
 import com.hwrj.cloud.admin.dto.param.SelectVo;
 import com.hwrj.cloud.admin.excelEntity.UmsCompanyInfoExcel;
 import com.hwrj.cloud.admin.model.UmsAdmin;
@@ -86,7 +87,7 @@ public class UmsCompanyController {
     @ResponseBody
     public CommonResult selectList(){
 
-        List<SelectVo> list = umsCompanyService.selectList();
+        List<SelectNewVo> list = umsCompanyService.selectList();
         return CommonResult.success(list);
     }
 

+ 12 - 12
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/controller/UmsMemberOriginController.java

@@ -111,12 +111,12 @@ public class UmsMemberOriginController {
     })
     @PostMapping("/save")
     public CommonResult save(@RequestBody @Valid UmsMemberOriginParam origin){
-        if (StringUtils.isEmpty(CurrUserUtil.getCompId())){
-            throw new GlobalException(1,"用户未绑定供应商不能添加生产地!");
-        }
-        origin.setCompId(CurrUserUtil.getCompId());
-        origin.setCompName(CurrUserUtil.getCompName());
-        origin.setCreateId(CurrUserUtil.getUserId());
+//        if (StringUtils.isEmpty(CurrUserUtil.getCompId())){
+//            throw new GlobalException(1,"用户未绑定供应商不能添加生产地!");
+//        }
+//        origin.setCompId(CurrUserUtil.getCompId());
+//        origin.setCompName(CurrUserUtil.getCompName());
+//        origin.setCreateId(CurrUserUtil.getUserId());
         int i = umsMemberOriginService.save(origin);
         return CommonResult.success(i);
     }
@@ -127,12 +127,12 @@ public class UmsMemberOriginController {
     })
     @PostMapping("/update")
     public CommonResult update(@RequestBody @Valid UmsMemberOriginParam origin){
-        if (StringUtils.isEmpty(CurrUserUtil.getCompId())){
-            throw new GlobalException(1,"用户未绑定供应商不能编辑生产地!");
-        }
-        origin.setCompId(CurrUserUtil.getCompId());
-        origin.setCompName(CurrUserUtil.getCompName());
-        origin.setUpdateId(CurrUserUtil.getUserId());
+//        if (StringUtils.isEmpty(CurrUserUtil.getCompId())){
+//            throw new GlobalException(1,"用户未绑定供应商不能编辑生产地!");
+//        }
+//        origin.setCompId(CurrUserUtil.getCompId());
+//        origin.setCompName(CurrUserUtil.getCompName());
+//        origin.setUpdateId(CurrUserUtil.getUserId());
         int i= umsMemberOriginService.update(origin);
         if (i > 0){
             return CommonResult.success(i);

+ 3 - 1
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dao/UmsCompanyInfoDao.java

@@ -1,6 +1,8 @@
 package com.hwrj.cloud.admin.dao;
 
+import com.hwrj.cloud.admin.dto.param.SelectNewVo;
 import com.hwrj.cloud.admin.dto.param.SelectVo;
+import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 
 import java.util.List;
@@ -9,5 +11,5 @@ import java.util.List;
 public interface UmsCompanyInfoDao {
     long deleteCheck(Long id);
 
-    List<SelectVo> selectList();
+    List<SelectNewVo> selectList(@Param("compId") Long compId);
 }

+ 2 - 1
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dto/UmsMemberOriginParam.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 import java.util.List;
 
@@ -21,7 +22,7 @@ public class UmsMemberOriginParam {
 
     @ApiModelProperty(value = "主键")
     private Long id;
-
+    @NotNull(message = "请选择供应商")
     @ApiModelProperty(value = "供应商id (供应商信息表 ums_company_info -> id)")
     private Long compId;
 

+ 9 - 0
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dto/param/SelectNewVo.java

@@ -0,0 +1,9 @@
+package com.hwrj.cloud.admin.dto.param;
+
+import lombok.Data;
+
+@Data
+public class SelectNewVo<T> {
+    private T value;
+    private String label;
+}

+ 2 - 1
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/service/UmsCompanyService.java

@@ -2,6 +2,7 @@ package com.hwrj.cloud.admin.service;
 
 import com.hwrj.cloud.admin.dto.UmsCompanyDto;
 import com.hwrj.cloud.admin.dto.param.CompanyWebPageParam;
+import com.hwrj.cloud.admin.dto.param.SelectNewVo;
 import com.hwrj.cloud.admin.dto.param.SelectVo;
 import com.hwrj.cloud.admin.excelEntity.UmsCompanyInfoExcel;
 import com.hwrj.cloud.admin.model.UmsAdmin;
@@ -118,5 +119,5 @@ public interface UmsCompanyService {
     public List<UmsCompanyInfo>  searchCompanyInfo(String key, int pageNo, int pageSize, Long compId);
 
 
-    List<SelectVo> selectList();
+    List<SelectNewVo> selectList();
 }

+ 7 - 7
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/service/impl/PmsProductServiceImpl.java

@@ -84,11 +84,11 @@ public class PmsProductServiceImpl implements PmsProductService {
         //创建商品
         PmsProduct product = productParam;
         product.setId(null);
-        long compId = CurrUserUtil.getCompId();
-        if(StringUtils.isEmpty(compId)){
-            throw new RuntimeException("没有绑定供应商无法新增!");
-        }
-        productParam.setCompId(compId);
+//        long compId = CurrUserUtil.getCompId();
+//        if(StringUtils.isEmpty(compId)){
+//            throw new RuntimeException("没有绑定供应商无法新增!");
+//        }
+//        productParam.setCompId(compId);
         productParam.setCompName(CurrUserUtil.getCompName());
         productParam.setCreateId((long) CurrUserUtil.getUserId());
         productParam.setCreateTime(new Date());
@@ -174,12 +174,12 @@ public class PmsProductServiceImpl implements PmsProductService {
     @Transactional
     public int update(Long id, PmsProductParam productParam) {
         //检验供应商
-        check(productParam);
+        //check(productParam);
         int count;
         //更新商品信息
         PmsProduct product = productParam;
         product.setId(id);
-        product.setCompId(CurrUserUtil.getCompId());
+//        product.setCompId(CurrUserUtil.getCompId());
         productMapper.updateByPrimaryKeySelective(product);
         //会员价格
         PmsMemberPriceExample pmsMemberPriceExample = new PmsMemberPriceExample();

+ 3 - 0
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/service/impl/UmsAdminServiceImpl.java

@@ -367,6 +367,9 @@ public class UmsAdminServiceImpl implements UmsAdminService {
     public UserDetails loadUserByUsername(String username){
         //获取用户信息
         UmsAdmin admin = getAdminByUsername(username);
+        if(StringUtils.isEmpty(admin)){
+            throw new UsernameNotFoundException("用户不存在!");
+        }
         Integer status = admin.getStatus();
         if(status.intValue() ==0 ){
             adminCacheService.delToken(admin.getUsername());

+ 12 - 2
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/service/impl/UmsCompanyInfoServiceImpl.java

@@ -8,6 +8,7 @@ import com.hwrj.cloud.admin.dao.UmsCompanyInfoDao;
 import com.hwrj.cloud.admin.dao.UmsCompanyShopDao;
 import com.hwrj.cloud.admin.dto.UmsCompanyDto;
 import com.hwrj.cloud.admin.dto.param.CompanyWebPageParam;
+import com.hwrj.cloud.admin.dto.param.SelectNewVo;
 import com.hwrj.cloud.admin.dto.param.SelectVo;
 import com.hwrj.cloud.admin.excelEntity.UmsCompanyInfoExcel;
 import com.hwrj.cloud.admin.mapper.UmsCompanyFileMapper;
@@ -15,6 +16,7 @@ import com.hwrj.cloud.admin.mapper.UmsCompanyInfoMapper;
 import com.hwrj.cloud.admin.mapper.UmsCompanyShopMapper;
 import com.hwrj.cloud.admin.model.*;
 import com.hwrj.cloud.admin.service.UmsCompanyService;
+import com.hwrj.cloud.admin.util.CurrUserUtil;
 import com.hwrj.cloud.common.api.CommonPage;
 import com.hwrj.cloud.common.exception.GlobalException;
 
@@ -188,6 +190,13 @@ public class UmsCompanyInfoServiceImpl implements UmsCompanyService {
         if(!org.springframework.util.StringUtils.isEmpty(keyword)){
             criteria.andCompNameLike("%"+keyword+"%");
         }
+        boolean admin = CurrUserUtil.getUmsAdmin().isAdmin();
+        if(!admin){
+            Long compIdInfo = CurrUserUtil.getCompIdInfo();
+            if(!org.springframework.util.StringUtils.isEmpty(compIdInfo)){
+                criteria.andIdEqualTo(compIdInfo);
+            }
+        }
         example.setOrderByClause("create_time desc");
         List<UmsCompanyInfo> companyInfos = umsCompanyInfoMapper.selectByExample(example);
         CommonPage<UmsCompanyInfo> umsCompanyInfoCommonPage = CommonPage.restPage(companyInfos);
@@ -357,8 +366,9 @@ public class UmsCompanyInfoServiceImpl implements UmsCompanyService {
     }
 
     @Override
-    public List<SelectVo> selectList(){
-        return umsCompanyInfoDao.selectList();
+    public List<SelectNewVo> selectList(){
+        Long compIdInfo = CurrUserUtil.getCompIdInfo();
+        return umsCompanyInfoDao.selectList(compIdInfo);
     }
 
 }

+ 1 - 3
forest-admin/admin-server/src/main/resources/dao/ProductExcelDao.xml

@@ -267,9 +267,7 @@
         ums_member_origin a
         WHERE
         a.state = 0
-        <if test="compId != null and compId != ''">
-            AND a.comp_id = #{compId}
-        </if>
+        AND a.comp_id = #{compId}
     </select>
 
     <update id="updateBrand">

+ 6 - 3
forest-admin/admin-server/src/main/resources/dao/UmsCompanyInfoDao.xml

@@ -37,15 +37,18 @@
                     )
             ) tmp
     </select>
-    <select id="selectList" resultType="com.hwrj.cloud.admin.dto.param.SelectVo">
+    <select id="selectList" resultType="com.hwrj.cloud.admin.dto.param.SelectNewVo" parameterType="Long">
 
         SELECT
-            a.id AS lable,
-            a.comp_name AS text
+            a.id AS 'value',
+            a.comp_name AS label
         FROM
             ums_company_info a
         WHERE
             a.comp_status = 0
+            <if test="compId !='' and compId">
+                AND a.id = #{compId}
+            </if>
         ORDER BY
             a.id DESC
 

+ 40 - 0
forest-gateway/src/main/java/com/hwrj/cloud/gateway/config/AbstractExceptionHandler.java

@@ -0,0 +1,40 @@
+package com.hwrj.cloud.gateway.config;
+
+import com.hwrj.cloud.common.exception.ApiException;
+import org.springframework.cloud.gateway.support.NotFoundException;
+import org.springframework.web.server.ResponseStatusException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class AbstractExceptionHandler {
+    private static String DEFAULT_ERROR_CODE = "500";
+
+    protected String formatMessage(Throwable ex) {
+
+        String errorMessage = null;
+        if (ex instanceof NotFoundException) {
+            String reason = ((NotFoundException) ex).getMessage();
+            errorMessage = reason;
+        } else if (ex instanceof ResponseStatusException) {
+            ResponseStatusException responseStatusException = (ResponseStatusException) ex;
+            errorMessage = responseStatusException.getMessage();
+        } else if (ex instanceof ApiException) {
+            ApiException exception = (ApiException) ex;
+            errorMessage = exception.getMessage();
+            DEFAULT_ERROR_CODE = exception.getErrorCode().getCode() + "";
+        } else {
+            errorMessage = ex.getMessage();
+        }
+        return errorMessage;
+    }
+
+    protected Map<String, Object> buildErrorMap(String errorMessage) {
+        Map<String, Object> resMap = new HashMap<>();
+        resMap.put("code", DEFAULT_ERROR_CODE);
+        resMap.put("message", errorMessage);
+        resMap.put("data", null);
+        return resMap;
+    }
+}

+ 35 - 0
forest-gateway/src/main/java/com/hwrj/cloud/gateway/config/GatewayExceptionConfig.java

@@ -0,0 +1,35 @@
+package com.hwrj.cloud.gateway.config;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.codec.ServerCodecConfigurer;
+import org.springframework.web.reactive.result.view.ViewResolver;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @Deacription TODO
+ * @Author jianhua.hong
+ * @Date 2020/4/2 10:45
+ **/
+@Configuration
+public class GatewayExceptionConfig {
+
+    @Primary
+    @Bean
+    @Order(Ordered.HIGHEST_PRECEDENCE)
+    public ErrorWebExceptionHandler errorWebExceptionHandler(ObjectProvider<List<ViewResolver>> viewResolversProvider,
+                                                             ServerCodecConfigurer serverCodecConfigurer) {
+        GatewayExceptionHandler gatewayExceptionHandler = new GatewayExceptionHandler();
+        gatewayExceptionHandler.setViewResolvers(viewResolversProvider.getIfAvailable(Collections::emptyList));
+        gatewayExceptionHandler.setMessageWriters(serverCodecConfigurer.getWriters());
+        gatewayExceptionHandler.setMessageReaders(serverCodecConfigurer.getReaders());
+        return gatewayExceptionHandler;
+    }
+}
+

+ 116 - 0
forest-gateway/src/main/java/com/hwrj/cloud/gateway/config/GatewayExceptionHandler.java

@@ -0,0 +1,116 @@
+package com.hwrj.cloud.gateway.config;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.codec.HttpMessageReader;
+import org.springframework.http.codec.HttpMessageWriter;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.util.Assert;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.server.RequestPredicates;
+import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import org.springframework.web.reactive.result.view.ViewResolver;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Deacription TODO
+ * @Author jianhua.hong
+ * @Date 2020/4/2 10:36
+ **/
+@Slf4j
+public class GatewayExceptionHandler extends AbstractExceptionHandler implements ErrorWebExceptionHandler {
+
+    private static final String TRACE_ID = "traceId";
+
+    private static final String JHJCN_BUSI_NOT_FOUND = "Unable to find instance for jhjcn-business";
+
+    private static final String JHJCN_BUSI_NOT_FOUND_ZH = "未xxx微服务,请检查服务是否可用";
+
+    private List<HttpMessageReader<?>> messageReaders = Collections.emptyList();
+
+
+    private List<HttpMessageWriter<?>> messageWriters = Collections.emptyList();
+
+
+    private List<ViewResolver> viewResolvers = Collections.emptyList();
+
+
+    private ThreadLocal<Map<String, Object>> exceptionHandlerResult = new ThreadLocal<>();
+
+
+    public void setMessageReaders(List<HttpMessageReader<?>> messageReaders) {
+        Assert.notNull(messageReaders, "'messageReaders' must not be null");
+        this.messageReaders = messageReaders;
+    }
+
+
+    public void setViewResolvers(List<ViewResolver> viewResolvers) {
+        this.viewResolvers = viewResolvers;
+    }
+
+
+    public void setMessageWriters(List<HttpMessageWriter<?>> messageWriters) {
+        Assert.notNull(messageWriters, "'messageWriters' must not be null");
+        this.messageWriters = messageWriters;
+    }
+
+    @Override
+    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
+        String errorMessage = super.formatMessage(ex);
+        if (errorMessage.equals(JHJCN_BUSI_NOT_FOUND)) {
+            errorMessage = JHJCN_BUSI_NOT_FOUND_ZH;
+        }
+        Map<String, Object> errorMap = super.buildErrorMap(errorMessage);
+        ServerHttpRequest request = exchange.getRequest();
+        String traceId = request.getHeaders().getFirst(TRACE_ID);
+        log.error("GatewayExceptionHandler request info [traceId={}] result error=[{}]", traceId, JSONObject.toJSONString(errorMap));
+        if (exchange.getResponse().isCommitted()) {
+            return Mono.error(ex);
+        }
+        exceptionHandlerResult.set(errorMap);
+        ServerRequest newRequest = ServerRequest.create(exchange, this.messageReaders);
+        return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse).route(newRequest)
+                .switchIfEmpty(Mono.error(ex))
+                .flatMap((handler) -> handler.handle(newRequest))
+                .flatMap((response) -> write(exchange, response));
+
+    }
+
+
+    protected Mono<ServerResponse> renderErrorResponse(ServerRequest request) {
+        Map<String, Object> result = exceptionHandlerResult.get();
+        return ServerResponse.status(HttpStatus.OK)
+                .contentType(MediaType.APPLICATION_JSON_UTF8)
+                .body(BodyInserters.fromObject(result));
+    }
+
+
+    private Mono<? extends Void> write(ServerWebExchange exchange,
+                                       ServerResponse response) {
+        exchange.getResponse().getHeaders()
+                .setContentType(response.headers().getContentType());
+        return response.writeTo(exchange, new ResponseContext());
+    }
+
+    private class ResponseContext implements ServerResponse.Context {
+
+        @Override
+        public List<HttpMessageWriter<?>> messageWriters() {
+            return GatewayExceptionHandler.this.messageWriters;
+        }
+
+        @Override
+        public List<ViewResolver> viewResolvers() {
+            return GatewayExceptionHandler.this.viewResolvers;
+        }
+    }
+}