使用RestTemplate将宝可梦接口列表响应解析映射到自定义POJO的方法
问题核心原因
你定义的POJO结构和宝可梦列表接口的实际返回结构不匹配,导致Jackson反序列化失败,无法完成映射,按照以下步骤修改即可实现需求:
1. 定义和接口响应结构匹配的POJO
宝可梦列表接口的标准返回外层包含总数、翻页链接、结果列表三个核心字段,结果列表中每个元素包含宝可梦名称和详情URL,对应POJO定义如下:
// 列表单个条目POJO @Data @NoArgsConstructor @AllArgsConstructor public class PokemonItem { private String name; private String url; } // 列表外层响应POJO @Data @NoArgsConstructor @AllArgsConstructor public class AllPokemonsResponse { private Integer count; private String next; private String previous; private List<PokemonItem> results; }
2. 修正Service层调用代码
修改响应类型为上面定义的AllPokemonsResponse,同时可直接通过limit参数一次性获取初代151只宝可梦数据,无需翻页:
//Service Class public AllPokemonsResponse findAllPokemonsApi() { log.info("Find All Pokemon From Api Service Call"); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); // GET请求不需要传body,直接传header即可 HttpEntity<Void> entity = new HttpEntity<>(headers); ResponseEntity<AllPokemonsResponse> response = restTemplate.exchange( GET_ALL_POKEMONS_API + "?limit=151", HttpMethod.GET, entity, AllPokemonsResponse.class ); return response.getBody(); }
3. 修正Controller层代码
对应修改返回类型即可:
@GetMapping("findAllPokemons/") public AllPokemonsResponse findAllPokemonsApi() { log.info("Get Pokemon From Api Controller Call"); return pokemonService.findAllPokemonsApi(); }
4. 批量拉取详情存入数据库的实现
拿到列表响应后遍历详情URL调用单查询接口,获取完整宝可梦数据后批量存库即可,示例逻辑:
// 新增Service方法实现存库逻辑 public void batchSave151Pokemons() { AllPokemonsResponse listResponse = findAllPokemonsApi(); List<Pokemon> allPokemons = listResponse.getResults().stream() // 复用你之前已经验证可用的单查询映射逻辑 .map(item -> restTemplate.getForObject(item.getUrl(), Pokemon.class)) .collect(Collectors.toList()); // 调用你项目的持久层接口批量保存即可,如JPA的saveAll、MyBatis的批量插入方法 pokemonDao.saveAll(allPokemons); }
内容的提问来源于stack exchange,提问作者Gabriel Vendramini
相关产品推荐
相关产品推荐

