You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java Spring中DTO响应JSON字段重命名问题:@JsonProperty注解未生效排查

解决Spring项目中@JsonProperty不生效的问题

我之前也碰到过一模一样的情况——明明按文档要求加了@JsonProperty注解,返回的JSON却还是保持驼峰命名。结合你的代码和场景,给你几个排查和解决的思路:

1. 检查Jackson依赖与版本冲突

首先确认项目里的Jackson依赖是否正常,尤其是Spring Boot项目:

  • 如果用的是spring-boot-starter-web,它已经默认包含了Jackson核心依赖(jackson-databindjackson-core等),不需要额外引入。
  • 排查是否有其他JSON库(比如Fastjson、Gson)的依赖,这类库可能会替换Spring默认的Jackson消息转换器,直接导致@JsonProperty注解失效。如果有这类依赖,要么移除,要么手动配置Spring强制使用Jackson作为默认转换器。

2. 验证Lombok与Jackson的兼容性

你用了Lombok的@Data注解自动生成getter/setter,有时候Lombok生成的方法逻辑可能和Jackson的解析规则不匹配,导致注解失效。可以试试这两个方案:

  • 方案一:把@JsonProperty移到getter方法上
    手动生成(或修改Lombok生成的)getter方法,将注解绑定到getter上:
    @JsonProperty("second_name")
    public String getSecondName() {
        return secondName;
    }
    
  • 方案二:配置Lombok兼容Jackson注解
    在项目根目录创建lombok.config文件,添加以下配置,让Lombok生成的代码适配Jackson的注解解析:
    lombok.anyConstructor.addConstructorProperties=true
    lombok.accessors.chain=true
    

3. 全局配置属性命名策略(更推荐)

如果你的DTO类大多需要驼峰转下划线,没必要逐个字段加@JsonProperty,直接全局配置Jackson的命名策略更高效:

  • application.yml配置方式
    spring:
      jackson:
        property-naming-strategy: SNAKE_CASE
    
  • application.properties配置方式
    spring.jackson.property-naming-strategy=SNAKE_CASE
    
    配置后,所有驼峰命名的字段都会自动转换成下划线格式,无需再手动加注解。

4. 检查自定义消息转换器是否覆盖默认配置

如果项目里自定义了WebMvcConfigurer并重写了configureMessageConverters方法,要确保没有替换掉默认的Jackson转换器,或者在自定义转换器里配置了正确的ObjectMapper

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        // 配置下划线命名策略
        objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
        converter.setObjectMapper(objectMapper);
        converters.add(converter);
    }
}

最后验证

按上面的方法调整后,重启项目再测试,应该就能得到下划线命名的JSON响应了——比如你的secondName会变成second_namedateOfBirth变成date_of_birth

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

火山引擎 最新活动