一、问题:VUE通过ajax.post请求向spring后台传参,bAppId属性接收不到,其他的值均正常接收
实体类定义:
VUE代码:
JAVA代码:
二、原因
实体类使用lombok.Data的@Data注解生成get/set,针对首字母小写,第二个字母大写的这种驼峰命名时,使用@Data注解生成的getter和setter方法分别是:
public String getBAppId() {
return bAppId;
}
public void setBAppId(String bAppId) {
this.bAppId = bAppId;
}
而Spring MVC 的默认 json 解析器就是 Jackson中解析对象的getter和setter方法应该是:
public String getbAppId() {
return bAppId;
}
public void setbAppId(String bAppId) {
this.bAppId = bAppId;
}
因此@RequestBody无法完成自动映射,才导致bAppId的取值为null。
一句话解释就是Lombook的@Data注解和Spring的Jackson对于get/set的生成方式不同,Jackson是setbAppId,Lombook是setBAppId,参数自动映射不到导致。
三、解决方法
1、重新bAppId的get/set方法
2、利用@JsonProperty(value = “bAppId”)注解,告诉Jackson在反序列化时给属性重新命名。@JsonProperty
常用写法:@JsonProperty("xxx"),一般标记在字段上。指定入参和出参的字段名。
修改后的代码如下:
实体类:
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
@ApiModel(value = "附件")
@Data
public class BaAttachFileEntityDto {
@JsonProperty(value = "bAppId")
@ApiModelProperty(value = "业务编号")
@TableField(value = "bappid", exist = true)
private String bAppId;
@ApiModelProperty(value = "业务类型")
@TableField(value = "type", exist = true)
private String type;
@ApiModelProperty(value = "文件名")
@TableField(value = "filename", exist = true)
private String fileName;
@ApiModelProperty(value = "路径")
@TableField(value = "filepath", exist = true)
private String filepath;
}
VUE代码:
saveBaAttachfile(fileInfo) {
console.log("dossiertransfer --- saveBa_attachfileData --- fileInfo", fileInfo)
console.log("dossiertransfer --- saveBa_attachfileData --- this.bappid", this.bappid)
let baAttachFileEntity = {
type: '测试',
bappidStr: this.bappid,
bAppId: this.bappid,
fileName: fileInfo.name,
filepath: fileInfo.url
}
console.log("saveBaAttachfile--- baAttachFileEntity", baAttachFileEntity)
axios({
url: '/api/saveBaAttachFile',
method: 'post',
data: baAttachFileEntity
}).then((res) => {
this.$message({
message: 'Ok,上传成功!',
type: 'success'
})
})
}
Spring代码:
@PostMapping("saveBaAttachFile")
@ApiOperation(value = "用于完成后的业务补录附件")
public Result<Object> saveBaAttachFile(@RequestBody BaAttachFileEntityDto baAttachFileDto) {
Result<Object> result = new Result<>();
log.info("保存附件表数据,入参:{}", baAttachFileDto);
return dossierTransferService.saveBaAttachFile(baAttachFileDto);
}
--------------------------------------------------------------文章结束-------------------------------------------------------