Java中WebClient返回JSON含类名异常问题排查求助
问题描述
用Postman调用某接口时,返回的JSON格式完全正常;但通过Java程序中的WebClient调用同一接口时,响应JSON的每个字段后都附带了类名(例如stat字段显示为stat: class Stat { })。此前相同代码能正确返回JSON格式,目前无法定位问题根源。
涉及的代码片段:
ResponseEntity response = webClientBuilder.build() .get() .uri(uriBuilder -> uriBuilder.path(resourceUrl).queryParams(queryParams).build()) .headers(headers) .retrieve() .toEntity(Test.class) .block();
当前异常响应结构示例:
stat: class Stat { } Tests: [class Test { A: class A { .... } } ]
可能原因及解决办法
Jackson序列化配置异常:WebClient使用的Jackson ObjectMapper可能被修改,开启了类信息输出的配置(比如设置了非NONE的
DefaultTyping)。
解决:手动配置ObjectMapper,关闭默认类型信息输出:ObjectMapper objectMapper = new ObjectMapper(); // 关闭类型信息写入 objectMapper.deactivateDefaultTyping(); WebClient webClient = WebClient.builder() .codecs(configurer -> { configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper)); configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper)); }) .build();依赖冲突篡改Jackson配置:项目新增依赖后,可能引入了冲突的Jackson版本,或者第三方库自动修改了Jackson的默认配置。
解决:通过依赖分析工具排查:- Maven:执行
mvn dependency:tree查看依赖树,排除冲突的Jackson相关依赖 - Gradle:执行
gradle dependencies查看依赖树,调整依赖版本或排除不必要的自动配置类
- Maven:执行
实体类注解配置错误:Test、Stat、A等实体类可能被添加了
@JsonTypeInfo这类会输出类名的注解,导致序列化时附带类信息。
解决:检查所有相关实体类的注解,移除不必要的@JsonTypeInfo,或调整其配置为仅在必要场景下生效。WebClient编码器被替换:WebClient默认的JSON编码器被替换为自定义编码器或其他第三方编码器,导致序列化逻辑异常。
解决:恢复WebClient的默认编码器配置,或明确指定使用Jackson编码器,确保序列化逻辑与Postman调用时一致。
内容的提问来源于stack exchange,提问作者Richa
相关产品推荐
相关产品推荐

