1问题分析:
(1)第一种可能:前端字段与后端属性名对应不上
(2)第二种可能;pojo类没有Getter和Setter方法来读取和写入属性值
(3)第三种可能:没有使用@RequestBody注解或者@RequestParam注解
2解决方法:
(1)第一种可能 解决方法: 检查自己的json数据和pojo类属性名
说一下我当时遇到的问题:我前端json对象里面又嵌套了一个json对象给后端导致我所有的属性值为null,所以我将嵌套的json对象删除就好了
pojo类:
java
/**
* 新增课程Dto
*/
@Data
@ApiModel
public class AddCourseDto {
@NotEmpty(message = "添加课程名称不能为空",groups={ValidationGroups.Inster.class})
@NotEmpty(message = "修改课程名称不能为空",groups={ValidationGroups.Update.class})
@ApiModelProperty(value = "课程名称", required = true)
private String name;
@NotEmpty(message = "适用人群不能为空")
@Size(message = "适用人群内容过少",min = 10)
@ApiModelProperty(value = "适用人群", required = true)
private String users;
@ApiModelProperty(value = "课程标签")
private String tags;
@NotEmpty(message = "课程分类不能为空")
@ApiModelProperty(value = "大分类", required = true)
private String mt;
@NotEmpty(message = "课程分类不能为空")
@ApiModelProperty(value = "小分类", required = true)
private String st;
@NotEmpty(message = "课程等级不能为空")
@ApiModelProperty(value = "课程等级", required = true)
private String grade;
@ApiModelProperty(value = "教学模式(普通,录播,直播等)", required = true)
private String teachMode;
@ApiModelProperty(value = "课程介绍")
private String description;
@ApiModelProperty(value = "课程图片", required = true)
private String pic;
@NotEmpty(message = "收费规则不能为空")
@ApiModelProperty(value = "收费规则,对应数据字典", required = true)
private String charge;
@ApiModelProperty(value = "价格")
private Float price;
@ApiModelProperty(value = "原价")
private Float originalPrice;
@ApiModelProperty(value = "qq")
private String qq;
@ApiModelProperty(value = "微信")
private String wechat;
@ApiModelProperty(value = "电话")
private String phone;
@ApiModelProperty(value = "有效期")
private Integer validDays;
}
/**
* 修改课程Dto
*/
@ApiModel
@Data
//解决实现EqualsAndHashCode不会考虑父类的属性
@EqualsAndHashCode(callSuper = true)
public class EditCourseDto extends AddCourseDto{
@ApiModelProperty(value = "课程id",required = true)
private Long id; //课程id
}
前端Json代码(错误实例):
javascript
{
"editCourseDto": {
"id": 861333945463,
"name":"洛克王国攻略",
"users":"00后专属buffer,童年回忆zzz",
"tags":"游戏攻略",
"mt":"游戏",
"st":"页游",
"grade":"1",
"teachMode":"录播",
"description":"洛克王国是一款转型小学生开发的游侠,内容简单好操作就是升级慢耗费时间。",
"pic":"113802717",
"charge":"55/1h",
"price":"100",
"originalPrice":"170",
"qq":"111111111",
"wechat":"1111111111",
"phone":"11111169182",
"validDays":"20221028",
}
}
改正前端代码:
javascript
{
"id": 861333945463,
"name":"洛克王国攻略",
"users":"00后专属buffer,童年回忆zzz",
"tags":"游戏攻略",
"mt":"游戏",
"st":"页游",
"grade":"1",
"teachMode":"录播",
"description":"洛克王国是一款转型小学生开发的游侠,内容简单好操作就是升级慢耗费时间。",
"pic":"113802717",
"charge":"55/1h",
"price":"100",
"originalPrice":"170",
"qq":"111111111",
"wechat":"1111111111",
"phone":"11111169182",
"validDays":"20221028",
}
(2)第二中可能 解决方法: 重写Getter和Setter方法或者使用Lombok的@Data注解
这里分析一下为啥需要重写Getter和Setter方法,
在Spring Boot项目中,使用POJO类来接收前端传递的JSON数据是因为Spring Boot内置了Jackson库,它可以将JSON数据自动地转换为Java对象。
Jackson库提供了`ObjectMapper`类,它可以将JSON数据反序列化为POJO对象。当前端向后端发送JSON数据时,Spring Boot会自动地使用Jackson库将JSON数据转换为POJO对象,并将其作为方法参数传递给相应的Controller方法。
为了正确地将JSON数据转换为POJO对象,需要确保POJO类中的字段名称与JSON数据中的字段名称匹配。Jackson库使用Java对象的Getter和Setter方法来读取和写入属性值,因此POJO类中的字段需要具有相应的Getter和Setter方法
(3)第三种可能 解决方法:
当前端传过来的是json数据需要在Controller方法中加上@RequestBody注解,当使用的是url传参并使用了集合类型必须加上@RequestParam注解
java
//传递的参数为json数据
@PutMapping
public CourseBaseInfoDto updateCourseBase(@RequestBody EditCourseDto editCourseDto){
Long companyId = 2138912L; //公司id
return courseBaseInfoService.updateCourseBase(companyId,editCourseDto);
}
//传递的参数为集合且为url传参
@GetMapping
public CourseBaseInfoDto updateCourseBase(@RequestParam List<String> list){
Long companyId = 2138912L; //公司id
return courseBaseInfoService.updateCourseBase(companyId,editCourseDto);
}