springboot中使用@RequestBody注解正常转换标注了@JSONField注解的字段的解决方法

一、问题描述

在springboot项目中使用@RequestBody注解接收POST请求中json类型的body,并将其转换为对象:

接口

@PostMapping("/createProject")
public String createProject(@RequestBody ProjectDto projectDto) {

    // ...

}

DTO 

package ...;

import com.alibaba.fastjson.annotation.JSONField;

public class ProjectDto {

    @JSONField(name =  "project_name")
    private String projectName;
    // ...

    public String getProjectName() {
        return projectName;
    }

    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }

    // ...
}

body

{
	"project_name":"xxx",
	...
}

二、效果

期望效果

body中写"project_name",后台能够接收并set到projectName字段。

实际效果

当body中写"project_name"时,打断点可以看到DTO的projectName字段为null,只有当body中写"projectName"时后台才可以正常接收。

三、解决方案

在目标字段上同时加上@JSONField注解和@JsonProperty注解

package ...;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;

public class ProjectDto {

    @JSONField(name =  "project_name")
    @JsonProperty("project_name")
    private String projectName;
    // ...

    public String getProjectName() {
        return projectName;
    }

    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }

    // ...
}

四、原理

@ResquestBody字段默认使用fasterxml中的converter方法将body中的json转换为对象,@JSONField注解属于fastjson,所以没有生效

注:由于我的项目中主要使用fastjson操作json对象,所以此处额外使用了@JSONField注解保证服务端内部操作对象时能够正确转换字段名称。如果没有相关需求,只需要使用jackson即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值