java.lang.IllegalStateException: No fallback instance of type class

 

在Feign服务降级的学习中遇到了个极品问题。

运行时异常 java.lang.IllegalStateException: No fallback instance of type class

网上谷歌了好多文章基本的解决方法如下

首先需要明确几个问题,首先有个微服务项目Parent,Parent下有很多模块

API模块内含了很多公用的接口(我们把Feign的回调方法与FeignClient注解标识的Service接口都写在这个模块里)如图

图1

下面是回调类与service接口以及主启动类的代码

图2

图3

图4

然后另起了三个模块作为Eureka集群

图5

还有个使用了hystrix的服务提供者下文中称为提供者

图6

最后一个是消费者

图7

消费者目录如下

图8

消费者主启动类

图9

如下是消费者暴露出来的接口代码,直接调用了api模块的DeptServiceINF接口(见图3)中的方法,我们如果去测试Add方法的话,这个时候如果唯一的一个提供者挂掉的话按理说我们是会调用FallBack类(见图2)中的回调方法,也就是是说会调用下图这个方法。

图11

 

图12

1、在回调类上使用@Component注解

2、在回调类所在的项目中添加配置

@Configuration
public class FallBackConfig {
    @Bean
    public DeptServiceFallBack deptServiceFallBack(){
        return new DeptServiceFallBack();
    }
}

3、在消费者中的配置文件加

feign.hystrix.enabled=true

然而上边几个方法我都试过了,依旧报错注入不到Spring容器,这个时候感觉像是Spring自带的问题?

我继续排查问题,在回调类上使用@Service也没软用,在API模块的主启动类加扫描包的注解也没屌用

 

直到。。。。

我突然想到这个错是我启动9002消费者的时候才抛出的运行时异常所以我在API那个模块中加什么注解肯定也不管用,因为API项目不会启动,自然不会注入到容器中,所以我就在修改了9002消费者的主启动类@SpringBootApplication注解

注解中扫描了两个包一个是回调类所在的包,一个是本启动类所在的包

我的老天,这个问题给我困了一整天还多。。。可算是整明白了

项目启动然后把8001服务提供者挂掉

访问9002消费者提供的add接口

如图,显示服务降级回调成功!!!!!!

总结,如果你把回调类写在了与消费者不同项目或者模块中,想要成功调用回调类中的方法的话你就得在消费者的主启动类配置好回调类的bean的扫描包路径。也就是加了@Component注解的回调类的路径。

顺带着提一嘴,如果是跟我一样分了多个项目而且把回调类写在了与消费者不同module中你必须每次修改公用的模块的时候都得进行mvn clean install并且重新对调用该修改过的公用模块的模块的pom文件进行reimport操作再启动。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
java.lang.IllegalStateException: No properties是一个异常,表示在代码中找不到配置属性。这个异常通常发生在使用Spring Boot时,没有正确配置@ConfigurationProperties注解的情况下。 解决这个问题的方法是确保在需要配置属性的类上添加@ConfigurationProperties注解,并在属性的getter和setter方法上添加@Value注解。这样Spring Boot就能正确地读取和注入配置属性。 以下是一个示例代码,演示了如何解决java.lang.IllegalStateException: No properties异常: ```java import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "myapp") public class MyAppProperties { private String property1; private int property2; public String getProperty1() { return property1; } public void setProperty1(String property1) { this.property1 = property1; } public int getProperty2() { return property2; } public void setProperty2(int property2) { this.property2 = property2; } } ``` 在上面的示例中,我们创建了一个名为MyAppProperties的类,并在类上添加了@ConfigurationProperties注解,并指定了属性的前缀为"myapp"。然后,我们定义了两个属性property1和property2,并为它们分别提供了getter和setter方法。 通过这样的配置,Spring Boot就能正确地读取和注入配置属性,避免了java.lang.IllegalStateException: No properties异常的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值