如何使用Spring Webflux WebClient处理嵌套JSON及MovieDB接口解析异常
问题解决方法
核心原因排查&修复方案
1. 给模型类补充无参构造注解
Lombok的@Data默认仅生成@RequiredArgsConstructor,嵌套对象反序列化时Jackson需要无参构造函数才能实例化Movie对象,给两个模型类都加上@NoArgsConstructor注解即可:
// 补充后的Movie类 @Data @NoArgsConstructor // 新增 @JsonIgnoreProperties(ignoreUnknown = true) public class Movie { // 原有字段保持不变 } // MovieDbResponse也可以补充该注解 @Data @NoArgsConstructor // 新增 @JsonIgnoreProperties(ignoreUnknown = true) public class MovieDbResponse { // 原有字段保持不变,建议把page、total_pages、total_results改为Integer类型,符合接口返回的数字类型 private Integer page; private List<Movie> results; private Integer total_pages; private Integer total_results; }
2. 排查Jackson字段命名策略冲突
如果你的Spring Boot项目全局配置了spring.jackson.property-naming-strategy=SNAKE_CASE,Jackson会自动把Java驼峰字段转为下划线JSON键,如果你已经在Java类中写了下划线格式的字段名(如backdrop_path),会被二次转换为backdrop__path(双下划线),导致和接口返回的键无法匹配。
修复方案二选一:
- 将Java字段改为驼峰命名(如
backdropPath、genreIds),依赖全局策略自动匹配下划线JSON键 - 给所有字段加
@JsonProperty显式指定对应JSON键:@JsonProperty("backdrop_path") private String backdrop_path; 3. 验证接口返回原始结构
可以临时修改WebClient调用逻辑,先打印原始返回JSON确认结构匹配:
public Mono<String> searchMovieRaw(String movieName){ return webclient.get() .uri(uriBuilder -> uriBuilder .path("/search/movie") .queryParam("page","1") .queryParam("query",movieName) .queryParam("api_key", apiKey) .queryParam("include_adult","false") .queryParam("language","en-US") .build() ) .retrieve() .bodyToMono(String.class) .doOnNext(rawJson -> System.out.println("接口返回原始内容:" + rawJson)); // 打印原始内容 }
4. 检查WebClient解码器配置
如果你是手动自定义WebClient实例,确认已注册默认Jackson解码器:
@Bean public WebClient movieDbWebClient() { return WebClient.builder() .baseUrl("https://api.themoviedb.org/3") .codecs(configurer -> configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder())) .build(); }
内容的提问来源于stack exchange,提问作者Isaccseven
相关产品推荐
相关产品推荐

