当前位置:   article > 正文

springcloud 微服务间通过 FeignClient 调用 抛出异常 和权限拦截 统一处理_feign可以抛出异常

feign可以抛出异常

 

  1. @Configuration
  2. public class CloudServerConfiguration {
  3. @Bean
  4. public HeaderInterceptor headerInterceptor() {
  5. //微服务权限拦截处理
  6. return new HeaderInterceptor();
  7. }
  8. @Bean
  9. @ConditionalOnProperty(name = "system.cloud.feign.exception.enabled", havingValue="true", matchIfMissing=true)
  10. public FeignExceptionAspect feignExceptionAspect() {
  11. //微服务权限拦截处理
  12. return new FeignExceptionAspect();
  13. }
  14. }
  1. /**
  2. * Title: FeignExceptionAspect
  3. * Description: Feign统一异常处理
  4. */
  5. @Aspect
  6. @Order(Ordered.LOWEST_PRECEDENCE - 100)
  7. public class FeignExceptionAspect {
  8. /**
  9. * Pointcut注解声明切点
  10. * 配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
  11. * @within 对类起作用,@annotation 对方法起作用
  12. */
  13. @Pointcut("@within(org.springframework.cloud.openfeign.FeignClient)")
  14. public void feignClientPointCut() {}
  15. /**
  16. * 配置前置通知,使用在方法aspect()上注册的切入点
  17. * 同时接受JoinPoint切入点对象,可以没有该参数
  18. * @param joinPoint
  19. * @throws ClassNotFoundException
  20. */
  21. @Around("feignClientPointCut()")
  22. public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
  23. Object object = proceedingJoinPoint.proceed();
  24. if(object instanceof ResponseDTO<?>) {
  25. ResponseDTO<?> responseDTO = (ResponseDTO<?>)object;
  26. if(!responseDTO.getCode().equals("10000000")) {
  27. throw new BusinessException(responseDTO.getCode(), responseDTO.getMessage());
  28. }
  29. }
  30. return object;
  31. }
  32. }

 

  1. /**
  2. * <p>Title: HeaderInterceptor</p>
  3. * <p>Description: 微服务间调用,免权限校验标志</p>
  4. *
  5. * @date 创建时间:2019年7月12日 上午11:31:50
  6. */
  7. public class HeaderInterceptor implements RequestInterceptor {
  8. // private static final Logger logger = LoggerFactory.getLogger(HeaderInterceptor.class);
  9. @Override
  10. public void apply(RequestTemplate requestTemplate) {
  11. //微服务间调用,免权限校验标志 参见 ScyPermissionAspect
  12. requestTemplate.header("ignoreScy", "true");
  13. // 从request取token信息
  14. ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  15. if(servletRequestAttributes == null) {
  16. return;
  17. }
  18. HttpServletRequest request = servletRequestAttributes.getRequest();
  19. Enumeration<String> headerNames = request.getHeaderNames();
  20. if (headerNames != null) {
  21. while (headerNames.hasMoreElements()) {
  22. String name = headerNames.nextElement();
  23. String value = request.getHeader(name);
  24. if ("usernameKey".equalsIgnoreCase(name)) {
  25. requestTemplate.header(name, value);
  26. }
  27. if ("appName".equalsIgnoreCase(name)) {
  28. requestTemplate.header(name, value);
  29. }
  30. if ("language".equalsIgnoreCase(name)) {
  31. requestTemplate.header(name, value);
  32. }
  33. }
  34. }
  35. }
  36. }

在项目中,经常会使用全局异常对代码异常进行捕捉,导致 其他微服务调用 FeignClient 异常会获取不到, 所以 需要做一个全局拦截 ,判断错误 则重新抛出异常

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/84664
推荐阅读
相关标签
  

闽ICP备14008679号