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

Java 14 Record与JPA实体映射遇Spring类型转换异常求助

问题分析与解决方案

你遇到的HttpMessageNotWritableException本质上是Jackson无法序列化Java 14的Record类型导致的——虽然MapStruct已经正确完成了User实体到UserDto的映射,但Spring MVC在将UserDto转换为JSON响应时,找不到适配Record类型的序列化转换器。

核心原因

Java 14引入的Record是一种全新的类结构,早期版本的Jackson(2.12之前)并未对其提供序列化/反序列化支持。而Spring Boot默认依赖Jackson作为JSON处理工具,若项目中Jackson版本过低,就会出现这个报错。

具体解决方案

1. 直接升级Jackson依赖(非Spring Boot项目)

Jackson从2.12.0版本开始正式支持Java 14的Record类型。如果是直接引入Jackson的项目,需要将依赖更新到2.12+:

<!-- Maven示例 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.3</version> <!-- 推荐使用稳定的新版本 -->
</dependency>

2. Spring Boot项目:升级Spring Boot版本

Spring Boot 2.4.0及以上版本默认引入的Jackson版本就是2.12+,只需升级父依赖版本即可:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.14</version> <!-- 选择适配项目的稳定版,如2.7.x或3.x系列 -->
    <relativePath/>
</parent>

3. 修复自定义Jackson配置(若有)

如果你有自定义的ObjectMapper配置,确保没有禁用自动配置,或手动注册Record支持模块:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 显式注册Record序列化支持模块(自动注册失效时使用)
        mapper.registerModule(new com.fasterxml.jackson.module.paramnames.ParameterNamesModule());
        return mapper;
    }
}

4. 验证序列化有效性

依赖调整完成后,可以写一个简单测试确认Record能正常序列化:

@Autowired
private ObjectMapper objectMapper;

@Test
void testRecordSerialization() throws JsonProcessingException {
    UserDto dto = new UserDto("TestName", "test@example.com", "http://example.com/avatar.jpg");
    String json = objectMapper.writeValueAsString(dto);
    System.out.println(json); // 应输出格式正确的JSON字符串
}

额外提示

MapStruct的映射逻辑是没问题的(你已经调试确认映射结果正确),问题完全出在JSON序列化环节。只要确保Jackson能正确识别Record类型,这个异常就会消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:12:29