zoukankan      html  css  js  c++  java
  • 搭建简单的SpringCloud项目三:问题及解决

     GitHub:https://github.com/ownzyuan/test-cloud

    前篇:搭建简单的SpringCloud项目一:注册中心和公共层

               搭建简单的SpringCloud项目二:服务层和消费层

    启动失败一

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'consumerController': Unsatisfied dependency expressed through field 'dataApi'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.zy.api.DataApi': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: target values must be absolute.

    问题简述:

    同一接口路径中存在多个方法,路径识别失败,目标值必须为绝对值。

    再查看代码:

    可以发现出现2个接口路径相同的方法,甚至方法名都相同,因为Rest是接口提供方,Api作为接收方理应使用同一接口路径和方法名,因此只需要在路径正确的情况下加以修改即可。

    修改DataApi:

    测试启动:

    启动成功。

     

    调用服务出现404

    feign.FeignException: status 404 reading StrApi01#returnStr01()

    分析:

    在定义服务提供者和消费者时,未区分对@FeignClient注解所修饰的身份,@FeignClient是标注此类为服务的调用方,也就是消费者,在本项目中对应的就是cloud-consumer。

    再看看此时项目的结构:

    很显然,在搭建架构的时候出现了问题,明明是消费方却提供给服务方接口,所以解决办法就是将2个框框处对换位置。

     

    无法调用对应API

    问题描述

    这是server方暴露的服务:

    这里的return是为了验证是否成功的一个测试语句。

    这是consumer方接受服务使用的Api:

    这是该Api的Hystrix的实现:

    这里我没做服务器降级的处理,加入了一条return以便后续验证调用是否成功

    通过controller调用该Api接口使用server提供的方法:

    启动项目,打开postman测试:

    可以发现返回的是DataFallback中的字符串,说明没有调用到服务。

    再打开数据库查看:

    可以发现确实没有添加成功。

    解决

    其实这个问题点比较易见,就是consumer中的启动类中没有添加@EnableFeignClients注解来扫描这些Api,现在将其添加:

    再次打开postman测试:

    打开数据库查看:

    成功解决。

    不过在添加完注解之后,其实并没有一帆风顺,因为添加之后启动就无法成功了,问题及原因见下一条。

     

    启动失败二

    问题描述

    在刚添加@EnableFeignClients之后启动:

    问题解释:大概意思就是存在多个@FeignClient修饰的类,他们@FeignClient的value的值都相同,比如,

    DataApi中@FeignClient的value的值:

    HelloApi中@FeignClient的value的值:

    由于出现多个相同Bean,所以报错。

    但是,一个服务提供肯定不是只提供一个接口的,所以一定会出现这个问题。

    解决

    具体分析参考:https://blog.csdn.net/u012211603/article/details/84312709

    在配置文件中加入:

    再次启动:

    成功

     

    项目不默认使用Java8

    这本身不是一个大问题,只是出现莫名的爆红很烦,比如:

    并且修改的时候,需要改动的地方很多

    setting中的Java compiler

    需要将圈出来的地方全部改为8

    然后是将每个Module的版本改为8

    改为如果切换了分支或者重启Idea,就又要重来,所以需要个很好的解决办法。

    在父工程中的pom中添加

     <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>8</source>
                        <target>8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>

    再刷新一下maven就完全解决了。

     

  • 相关阅读:
    模仿商品分类点击效果
    Element MenuNav刷新后点击菜单保留选中状态
    element后端管理布局
    Element NavMenu动态生成导航菜单
    谁的速度快!谁背锅(技术解析)
    “非科班自学”复盘两个月时间在年底成功拿下了字节、阿里offer,入职了字节!
    用了这么久,你真的明白 HttpClient的实现原理了吗?
    求你了,不要再在对外接口中使用枚举类型了
    Docker 实战总结(非常全面),收藏了!
    Service层和Dao层真的有必要每个类都加上接口吗?
  • 原文地址:https://www.cnblogs.com/kzyuan/p/14666710.html
Copyright © 2011-2022 走看看