Spring Boot FeignClient 업무 이상 정보 캡 처

4361 단어 springcloud
4. 567917. 프로젝트 재 구성 으로 인해 spring cloud 를 사용 하기 때문에 feign 은 불가피 합 니 다.현재 spring cloud 는 국내 에서 아직 성숙 하지 않 기 때문에 구 덩이 를 밟 는 것 은 불가피 하 다.최근 에 전체 국면 이상 문 제 를 처리 하 였 으 나, 여러 번 뒤 져 보 았 지만, 적합 한 해결 방안 을 찾 지 못 했다.
1. 전역 이상 처리

import com.bossien.common.comm.entity.ResponseDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * @Author: lixg
     * @Description:         
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public ResponseDto errorExceptionHandler(Exception ex) {//APIResponse             ,                
        logger.error("    Exception   ", ex);
        //      
        return new ResponseDto(ResponseDto.RESPONSE_FAIL, "    ,     ");
    }

    /**
     * @Author: lixg
     * @Description:          
     */
    @ResponseBody
    @ExceptionHandler(value = BusinessException.class)//BusinessException         
    public ResponseDto businessExceptionHandler(BusinessException ex) {
        logger.error("    BusinessException   : code=" + ex.getCode() + " , errorMessage=" + ex.getErrorMessage());
        return new ResponseDto(ex.getCode(), ex.getErrorMessage());
    }

}

2. 매개 변수 분석 요청 handler
import com.alibaba.fastjson.JSONObject;
import com.ocean.common.comm.entity.ResponseDto;
import com.ocean.common.core.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/***
 * @author lixg
 *
 * feign        
 */
public class ResponseHandler {
    private final static Logger logger = LoggerFactory.getLogger(ResponseHandler.class);

    /**
     *         
     * @param responseDto
     * @param clazz
     * @return
     * @throws BusinessException
     */
    public static Object getResponseData(ResponseDto responseDto, Class clazz) throws BusinessException {
        if(EmptyUtil.isEmpty(responseDto)){
            throw new BusinessException(BusinessException.OBJECT_IS_NULL,"      !");
        }
        if(ResponseDto.RESPONSE_SUCCESS.equals(responseDto.getCode())){
            try {
                String json = JSONObject.toJSONString(responseDto.getData());
                return JSONObject.parseObject(json, clazz);
            }catch (Exception e){
                logger.error("        :"+clazz.getName(),e);
                throw new BusinessException(BusinessException.OBJECT_IS_NULL,"        !");
            }
        }else{
            throw new BusinessException(responseDto.getCode(),responseDto.getMessage());
        }
    }
}

3. 비 즈 니스 feign 인터페이스
package com.bossien.usercenter.user.feign;

import com.bossien.common.comm.entity.ResponseDto;
import com.bossien.common.comm.util.PageModel;
import com.bossien.common.comm.constant.SearchEntity;
import com.bossien.common.core.exception.BusinessException;
import com.bossien.usercenter.user.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

@FeignClient(value="bossien-usercenter-service",path = "/userFeign")
@Repository
public interface UserFeign {

    @RequestMapping(value = "getUserInfo",method = RequestMethod.GET)
    User getUserInfo(@RequestParam("userId") Long userId);

    @RequestMapping(value = "getUserInfoByTicket",method = RequestMethod.GET)
    ResponseDto getUserInfoByTicket(@RequestParam("ticket") String ticket) throws BusinessException;
 
 }

결론: @ controller Advice 또는 Handler Exception Resolver 는 FeignException 을 직접 포착 할 수 없 기 때문에 Feign 차원 에서 구체 적 인 이상 을 받 아 다시 포장 해 야 합 니 다.마지막 으로 클 라 우 드 서비스 내부 의 이상 안전 (같은 오류 코드, 같은 오류 정보) 을 클 라 이언 트 에 게 보 냈 습 니 다!!

좋은 웹페이지 즐겨찾기