spring cloud alibaba 关于获取 feignClientsRegistrarFactoryBean 空指针的bug

157 阅读1分钟

我的版本

spring-cloud-alibaba-dependencies 2021.1

spring-cloud-dependencies 2020.0.0

github bug地址github.com/alibaba/spr…

github.com/alibaba/spr… 根据上面链接给出的代码改了一下,能用。

import cn.hutool.core.util.ReflectUtil;
import com.alibaba.cloud.sentinel.feign.SentinelFeign;
import feign.Target;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext;

import java.lang.reflect.Field;

@Aspect
public class SentinelTargeterAspect {

    @Around("execution(* org.springframework.cloud.openfeign.Targeter.target(..))")
    public Object process(ProceedingJoinPoint pjp) throws Throwable {
        SentinelFeign.Builder factory = (SentinelFeign.Builder) pjp.getArgs()[1];
        Target.HardCodedTarget target = (Target.HardCodedTarget) pjp.getArgs()[3];
        //hutool工具类反射
        Field field = ReflectUtil.getField(factory.getClass(), "applicationContext");
        ApplicationContext applicationContext = (ApplicationContext) ReflectUtil.getFieldValue(factory, field);
        GenericApplicationContext gctx = (GenericApplicationContext) applicationContext;
        BeanDefinition def = gctx.getBeanDefinition(target.type().getName());
        def.setAttribute("feignClientsRegistrarFactoryBean", pjp.getArgs()[0]);
        return pjp.proceed();
    }

}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {

    @Bean
    public SentinelTargeterAspect sentinelTargeterAspect() {
        return new SentinelTargeterAspect();
    }
}