springcloud feign 注入bean null问题

本文介绍了解决Spring Cloud项目中Feign与Swagger2版本冲突导致的问题,通过升级Swagger版本到2.5.0以上成功避免了启动失败的错误。

此问题主要是由于feign 和swagger2版本冲突导致的。

本人用到的springcloud版本,如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Dalston.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

swagger2版本:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.2.2</version>
</dependency>

导致启动项目失败,错误如下:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demoController': Unsatisfied dependency expressed through field 'schedualServiceHi'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.qtdbp.trading.client.HiService': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
at com.qtdbp.trading.WebApplication.main(WebApplication.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.qtdbp.trading.client.HiService': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1634)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1309)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1275)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 24 common frames omitted
Caused by: java.lang.NullPointerException: null
at springfox.documentation.schema.property.OptimizedModelPropertiesProvider.beanDescription(OptimizedModelPropertiesProvider.java:317)
at springfox.documentation.schema.property.OptimizedModelPropertiesProvider.propertiesFor(OptimizedModelPropertiesProvider.java:117)
at springfox.documentation.schema.property.OptimizedModelPropertiesProvider$$FastClassBySpringCGLIB$$cb306bb2.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at springfox.documentation.spring.web.caching.CachingAspect.cachedValue(CachingAspect.java:86)
at springfox.documentation.spring.web.caching.CachingAspect.operationsAndProperties(CachingAspect.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
at springfox.documentation.schema.property.OptimizedModelPropertiesProvider$$EnhancerBySpringCGLIB$$48c6024c.propertiesFor(<generated>)
at springfox.documentation.schema.ModelDependencyProvider.propertiesFor(ModelDependencyProvider.java:184)
at springfox.documentation.schema.ModelDependencyProvider.nonTrivialProperties(ModelDependencyProvider.java:132)
at springfox.documentation.schema.ModelDependencyProvider.resolvedPropertiesAndFields(ModelDependencyProvider.java:121)
at springfox.documentation.schema.ModelDependencyProvider.resolvedDependencies(ModelDependencyProvider.java:100)
at springfox.documentation.schema.ModelDependencyProvider.dependentModels(ModelDependencyProvider.java:62)
at springfox.documentation.schema.ModelDependencyProvider$$FastClassBySpringCGLIB$$ac0d0878.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at springfox.documentation.spring.web.caching.CachingAspect.cachedValue(CachingAspect.java:86)
at springfox.documentation.spring.web.caching.CachingAspect.modelsAndDependencies(CachingAspect.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
at springfox.documentation.schema.ModelDependencyProvider$$EnhancerBySpringCGLIB$$4669045e.dependentModels(<generated>)
at springfox.documentation.schema.DefaultModelProvider.dependencies(DefaultModelProvider.java:113)
at springfox.documentation.schema.DefaultModelProvider$$FastClassBySpringCGLIB$$2c8f6146.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
at springfox.documentation.schema.DefaultModelProvider$$EnhancerBySpringCGLIB$$674eff88.dependencies(<generated>)
at springfox.documentation.spring.web.scanners.ApiModelReader.populateDependencies(ApiModelReader.java:131)
at springfox.documentation.spring.web.scanners.ApiModelReader.read(ApiModelReader.java:75)
at springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:91)
at springfox.documentation.spring.web.scanners.ApiDocumentationScanner.scan(ApiDocumentationScanner.java:62)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.scanDocumentation(DocumentationPluginsBootstrapper.java:101)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.onApplicationEvent(DocumentationPluginsBootstrapper.java:87)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.onApplicationEvent(DocumentationPluginsBootstrapper.java:50)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:383)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:389)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:337)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:882)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545)
at org.springframework.cloud.context.named.NamedContextFactory.createContext(NamedContextFactory.java:116)
at org.springframework.cloud.context.named.NamedContextFactory.getContext(NamedContextFactory.java:85)
at org.springframework.cloud.context.named.NamedContextFactory.getInstance(NamedContextFactory.java:121)
at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.get(FeignClientFactoryBean.java:127)
at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.feign(FeignClientFactoryBean.java:84)
at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:155)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
... 34 common frames omitted


代码如下:

@FeignClient(value = "boss-service", fallback= HiClientHystrix.class)
public interface HiService {

    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}

@Component
public class HiClientHystrix implements HiService {

    @Override
    public String sayHiFromClientOne(@RequestParam(value = "name") String name) {
        return "exception" ;
    }
}

@RestController
public class DemoController {

    @Autowired
    private HiService schedualServiceHi;

//    @Autowired
//    private SchedualServiceHi schedualServiceHi;

    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    public String sayHi(@RequestParam String name){
        return schedualServiceHi.sayHiFromClientOne(name);
    }
}

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }

}


解决办法:

1. 如果swagger版本是v1.x,那么请参考:https://segmentfault.com/a/1190000006595187

2. 如果swagger版本是v2.x,那么请将升级swagger版本到2.5.0以上即可。

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.5.0</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.5.0</version>
</dependency>



<think>嗯,用户现在遇到了在Spring Cloud Gateway的@RestController类中,使用@Autowired注入的依赖为null问题。我需要仔细分析可能的原因,并结合之前提供的解决方案和引用内容来给出有效的回答。 首先,用户之前的问题是关于DiscoveryClient注入null,现在转向了Gateway中的@RestController。可能的原因有类似之处,比如依赖缺失、配置问题、包扫描范围、Bean冲突或版本兼容性。但Gateway作为网关,可能有其特殊的配置和限制,需要特别注意。 根据用户提供的引用内容,引用[2]提到在全局过滤器中注入OpenFeign导致启动失败,解决方法是修改配置或使用@Lazy注解。这可能涉及到Gateway的自动配置和Bean加载顺序的问题。另外,引用[3]提到了Gateway的过滤器工厂,可能和请求处理流程有关,但暂时不确定是否与当前问题相关。 接下来,我需要考虑在Spring Cloud Gateway中,@RestController是否被正确识别。Gateway默认是使用WebFlux作为响应式编程模型,而如果用户错误地引入了Spring MVC的依赖,比如spring-boot-starter-web,会导致上下文冲突,从而使得基于Servlet的组件(如@RestController)无法正确初始化,导致注入失败。这一点需要重点检查。 另外,包扫描的问题也很重要。如果主启动类没有在正确的包路径下,可能无法扫描到@RestController所在的包,导致Bean未被创建,进而注入null。需要用户确认主类的包位置。 还有可能的是作用域问题,比如在过滤器或非控制器类中尝试注入Bean,但用户的问题明确是在@RestController中,所以可能不太相关。不过,如果该RestController位于不同的模块或未被组件扫描覆盖,也会导致问题。 另外,Bean的初始化顺序可能影响注入。例如,如果某个被注入Bean尚未被Spring容器初始化,使用@Lazy注解可以延迟加载,解决依赖问题。这在引用[2]中也有提到,使用@Lazy解决OpenFeign问题,可能同样适用于其他Bean注入。 版本兼容性也是一个潜在因素。Spring Cloud Gateway的不同版本可能有不同的自动配置方式,需要确保所有依赖的版本一致,避免因版本不匹配导致Bean无法创建。 现在,我需要将这些可能性整理成一个结构化的回答,分步骤说明可能的原因和对应的解决方案。同时,结合用户提供的引用内容,特别是引用[2]中的@Lazy和配置修改,可能需要特别指出WebFlux与MVC的冲突,以及动态路由配置可能带来的影响。 另外,用户之前的问题中提到了检查依赖、配置、包扫描、依赖冲突和版本兼容性,这些步骤同样适用于当前问题,但需要根据Gateway的特性进行调整。例如,检查是否错误引入了MVC的依赖,确认使用WebFlux的依赖,确保Gateway的自动配置正确启用。 最后,生成相关问题,帮助用户进一步排查可能的问题,比如如何区分WebFlux和MVC,动态路由配置的影响,以及@Lazy的使用场景。</think>针对Spring Cloud Gateway中`@RestController`类内`@Autowired`注入null问题,以下是系统性解决方案: --- ### 一、检查Web框架冲突(核心问题) 1. **确认未混用WebFlux与Spring MVC** Gateway基于**响应式编程模型**(WebFlux),若同时引入Spring MVC依赖会导致上下文冲突: ```xml <!-- 错误示例:同时存在WebFlux和MVC依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 必须移除 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <!-- 正确依赖 --> </dependency> ``` **混用会导致Controller未被正确初始化**[^1] 2. **验证项目结构** 使用以下命令检测是否存在Servlet API: ```bash mvn dependency:tree | grep 'spring-webmvc' ``` 若存在输出,需排除MVC依赖 --- ### 二、检查组件扫描范围 3. **确认主类包路径** 确保`@SpringBootApplication`主类位于**根包路径**,能扫描到Controller类: ```java // 正确结构示例 com.example.gateway ├── Application.java // 主类 └── controller └── MyController.java // @RestController类 ``` 4. **显式添加组件扫描** 若Controller位于独立模块,需手动指定扫描路径: ```java @SpringBootApplication(scanBasePackages = {"com.example.gateway", "com.example.common"}) ``` --- ### 三、排查路由配置冲突 5. **检查动态路由配置** 参考引用[2]的配置冲突问题,`spring.cloud.gateway.discovery.locator.enabled=true`可能导致Bean加载异常: ```yaml spring: cloud: gateway: discovery: locator: enabled: false # 禁用动态路由加载 ``` **该配置开启时会覆盖自定义Controller路由**[^2] --- ### 四、处理延迟加载问题 6. **使用@Lazy注解** 针对某些需要延迟初始化的Bean(如Feign客户端),参考引用[2]方案: ```java @RestController public class MyController { @Lazy @Autowired private MyService myService; // 解决循环依赖/初始化顺序问题 } ``` --- ### 五、验证Bean注册状态 7. **通过Actuator端点检查** 添加`spring-boot-starter-actuator`依赖后访问: ``` http://localhost:8080/actuator/beans ``` 搜索目标Bean名称确认注册状态 --- ### 六、版本兼容性验证 8. **核对Spring Cloud版本** 确保使用兼容版本组合(示例): ```xml <properties> <spring-boot.version>2.7.12</spring-boot.version> <spring-cloud.version>2021.0.3</spring-cloud.version> </properties> ``` 版本不匹配会导致自动配置失效[^3] --- ### 典型错误示例分析 ```java // 错误场景:同时存在WebFlux和MVC @RestController // 实际未被正确初始化 public class FallbackController { @Autowired // 注入失败 private RateLimitService rateLimitService; } ``` **现象**:Controller可访问但所有注入字段为null **解决方案**:移除`spring-boot-starter-web`依赖 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值