You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot调用第三方API获取数据无法存入数据库该如何解决?

异常原因

核心报错信息已经明确指向了问题根因:Cannot deserialize value of type com.project.beerapp.domain.Beer from Array value
你请求的第三方接口返回的是JSON数组结构(响应内容以[开头),但你在调用restTemplate.getForEntity时指定的反序列化目标类型是单个Beer对象,Jackson反序列化工具无法将数组结构映射为单个对象,因此抛出类型不匹配异常。

修复方案

1. 修改返回值接收类型

将RestTemplate请求的返回类型调整为啤酒数组或者List<Beer>泛型类型,两种可选写法如下:

写法1:数组类型接收

// 调整getForEntity的第二个参数为Beer数组类
ResponseEntity<Beer[]> response = restTemplate.getForEntity("https://api.punkapi.com/v2/beers", Beer[].class);
Beer[] beerArray = response.getBody();
// 非空校验后批量存库
if (beerArray != null && beerArray.length > 0) {
    beerRepository.saveAll(Arrays.asList(beerArray));
}

写法2:泛型List接收

如果需要直接拿到List<Beer>类型,使用exchange方法配合ParameterizedTypeReference实现:

ParameterizedTypeReference<List<Beer>> typeReference = new ParameterizedTypeReference<List<Beer>>() {};
ResponseEntity<List<Beer>> response = restTemplate.exchange("https://api.punkapi.com/v2/beers", HttpMethod.GET, null, typeReference);
List<Beer> beerList = response.getBody();
// 非空校验后批量存库
if (beerList != null && !beerList.isEmpty()) {
    beerRepository.saveAll(beerList);
}

2. 额外优化建议

不要将接口调用、存库逻辑直接写在main方法中,Spring Boot启动时main方法执行时Spring容器还未完全初始化,会出现restTemplate、beerRepository等bean未注入的空指针问题,建议将这部分逻辑放到CommandLineRunner或ApplicationRunner的实现类中,待容器完全启动后再执行。

内容的提问来源于stack exchange,提问作者markz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:30:05