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
相关产品推荐
相关产品推荐

