声明式OpenFeign使用1:日常使用ResponseResult<T>统一返回对象对外部接口接参失败。

在SpringCloud微服务架构的项目中,通过OpenFeign调用高德地图API时遇到返回参数为空的问题。原因是Feign接口的接参对象与返回的JSON对象不匹配,导致对象反序列化失败。解决方案是将接参对象改为与返回JSON匹配的Vo类,而不是使用统一的ResponseResult<T>。通过检查Feign接口配置、Controller和Service层代码,以及开启Feign日志,最终定位并解决了问题。

问题背景:在本人的个人项目中,在搭建Map地图服务时,需要调用高德地图的API。这个时候一般我们有以下几种方式可以选择:

1. 通过java.net.HttpURLConnection (原生)。

2. 通过org.apache.http.client.HttpClient (Apache HttpComponents)。

3. 通过Spring框架自带的RestTemplate对象。

4. 通过OpenFeign/Retrofit远程调用。

由于本人在项目中采用的是SpringCloud微服务架构,所以采用了自己比较熟悉的OpenFeign远程调用框架。

而使用OpenFeign调用其他平台的API,则需要定义声明式Feign接口。

问题描述:通过声明式Feign调用接口,返回来的参数一直是空的。

问题原因:接参的对象 和 返回的JSON对象 对不上。因为之前Feign接口一直用的是统一返回对象ResponseResult<T>,没有使用过声明式的Feign接口,所以导致忘记修改接参对象导致对象反序列化失败,数据为空。

解决方案:接参对象直接改为Vo,不用ResponseResult封装。

直接上调用链路

Step0:先看看Feign接口代码和FeignConfig拦截器配置。

这一块是该声明式Feign接口的代码,可以看到里面包含了Feign声明式接口的所有配置,前置URL是高德地图平台提供的。

 

这块是FeignConfig配置类,对GET请求添加了key秘钥和返回类型的参数(也是高德地图提供的)。

 

Step1:Controller层代码。

 Controller层代码没什么问题,主要是做了数据校验。

Step2:Service层代码。(上图的业务代码)

 在Service层中,我们在return语句处打一个断点,看看具体的数据有没有问题。

看URL好像并没有什么问题,前置URL是正确的,那我们就需要查看完整的URL对不对了。

 Step3:打开Feign日志,打印详细的Feign请求信息。

这一步,我们成功打开了Feign的详情日志。

Step4:再次调用接口,查看请求详细信息。

这一步发现,调用了接口是有数据返回回来的,那问题就很清楚了:

接参的对象 和 返回的JSON对象 对不上。

 

你正在使用 **Spring Boot 2.3.4.RELEASE**,对应的 Spring Cloud 版本应为 **Hoxton.SR12**。 为了让你能正确引入 `<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>`,请按照如下步骤操作: --- ## ✅ 正确配置 `pom.xml` ### 1. **设置 Spring Boot 版本** ```xml <properties> <java.version>1.8</java.version> <spring.boot.version>2.3.4.RELEASE</spring.boot.version> </properties> ``` --- ### 2. **引入 Spring Cloud 的 BOM(版本管理)** ```xml <dependencyManagement> <dependencies> <!-- Spring Cloud 依赖管理 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR12</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` --- ### 3. **添加 Feign 依赖** ```xml <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> </dependency> <!-- Feign Starter --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> ``` --- ### ✅ 完整的 `pom.xml` 示例 ```xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>dbs-api</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> <spring.boot.version>2.3.4.RELEASE</spring.boot.version> </properties> <!-- Spring Cloud BOM 管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR12</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> </dependency> <!-- Feign Client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` --- ## 🚨 常见问题排查 ### ✅ 问题1:无法解析 `spring-cloud-starter-openfeign` - **解决**:确认是否已添加 `<dependencyManagement>` 引入了 Spring Cloud 的 BOM。 - 没有 BOM,Maven 不知道要使用哪个版本的 Feign。 ### ✅ 问题2:Maven 报错 `UnknownHostException` 或下载失败 - **解决**:检查网络,或在 `settings.xml` 中配置国内镜像(如阿里云): ```xml <mirrors> <mirror> <id>aliyun</id> <name>Aliyun Maven</name> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> ``` --- ## ✅ 补充知识点 - **Spring Cloud Starter OpenFeign**:用于构建声明式 REST 客户端,替代 `RestTemplate`。 - **Spring Cloud BOM 管理**:确保多个 Spring Cloud 组件之间的版本兼容。 - **依赖无法引入的原因**:通常是未指定版本(需配合 BOM)或网络问题导致下载失败。 --- 如你仍无法引入,可贴出完整错误日志,我帮你进一步排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值