openfeign服务相互调用碰到问题总结

起因:服务A调用服务B,B中返回了数据,A服务没接收到。

经查发现是服务A中标注@FeignClient的接口,数据类型和服务B的返回的类型不一样。

一、服务B

复制代码
@RestController
@RequestMapping("/lanren312")
public class Lanren312Controller {

	@GetMapping("findById")
	public SimpleResp<Object> findById(@RequestParam("id") String id) {
		
		SimpleResp<Object> resp = lanren312Service.findById(id); // 如果这里面返回的List<String>就没问题,如果是一个对象集合,那么Lanren312Service中也要写对象集合
		return resp;
	}
}


@Data
public class SimpleResp<T> {

    private Integer code;
    private String msg;
    private T data;
}

二、服务 A

复制代码
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

// 启动类上添加@EnableFeignClients,basePackages指向标注了@FeignClient注解的接口
// feign目录下包含多个接口,Lanren312Service
@EnableFeignClients(basePackages = {"com.lanren312.feign"})

@FeignClient(name = "lanren312",fallback = Lanren312ServiceFallback.class)  // name只是一个名称。
public interface Lanren312Service {

	// 样例一,这里用 List<String>, 那A服务里面的findById返回的也必须是 List<String>,如果返回的是对象就会报错:"获取信息失败"
	@GetMapping("/lanren312/findById")
    SimpleResp<List<String>> findById(@RequestParam("id") String id);
	
	// 样例二,如果A服务里面的findById返回的是 List<lanren312Vo>,这里就可以这样写
	@GetMapping("/lanren312/findById")
    SimpleResp<List<lanren312Vo>> findById(@RequestParam("id") String id); 
	
	// 样例三,可以这样写,B服务调用后需要处理下
	@GetMapping("/lanren312/findById")
    SimpleResp<Object> findById(@RequestParam("id") String id);
}

@Component
public class Lanren312ServiceFallback implements Lanren312Service {

	@Override
    public SimpleResp<List<String>> findById(String id) {
        return new SimpleResp<>(-1, "获取信息失败");
    }
	
	......
}

具体的调用

复制代码
@Resource
private Lanren312Service lanren312Service
 
// 样例二
SimpleResp<List<GetTeacherStudentListResp>> result = lanren312Service.findById(id); // 直接是对象
List<String> ids = listLink.stream().map(it -> it.get("id").toString()).collect(Collectors.toList());

// 样例三
SimpleResp<Object> result = lanren312Service.findById(id);
List<LinkedHashMap<String, Object>> listLink = (List<LinkedHashMap<String, Object>>) result.getData(); // 是一个 LinkedHashMap
List<String> ids = listLink.stream().map(it -> it.get("id").toString()).collect(Collectors.toList());
相关推荐
tianyagukechat16 分钟前
rockylinux9.5 配置IP
java·网络·tcp/ip
程序员Sonder24 分钟前
黑马java----正则表达式(一文弄懂)
java·正则表达式·新人首发
doris820425 分钟前
Python 正则表达式 re.findall()
java·python·正则表达式
Anastasiozzzz39 分钟前
阿亮随手记:动态条件生成Bean
java·前端·数据库
丹牛Daniel1 小时前
Java解决HV000183: Unable to initialize ‘javax.el.ExpressionFactory‘
java·开发语言·spring boot·tomcat·intellij-idea·个人开发
消失的旧时光-19432 小时前
智能指针(三):实现篇 —— shared_ptr 的内部设计与引用计数机制
java·c++·c·shared_ptr
芒克芒克2 小时前
深入浅出CopyOnWriteArrayList
java
wuqingshun3141592 小时前
说一下java的反射机制
java·开发语言·jvm
A懿轩A2 小时前
【Java 基础编程】Java 异常处理保姆级教程:try-catch-finally、throw/throws、自定义异常
java·开发语言·python
极客先躯2 小时前
高级java每日一道面试题-2025年7月14日-基础篇[LangChain4j]-如何集成开源模型(如 Llama、Mistral)?需要什么基础设施?
java·langchain·存储·计算资源·模型服务框架·网络 / 协议·java 依赖