Spring boot 的 Postman Post 请求保存了整个 JSON 正文,而不仅仅是字段值。我该如何解决?
Posted
技术标签:
【中文标题】Spring boot 的 Postman Post 请求保存了整个 JSON 正文,而不仅仅是字段值。我该如何解决?【英文标题】:Postman Post request for Spring boot saves the entire JSON body instead of just the field value. How do I fix this? 【发布时间】:2020-06-29 20:32:35 【问题描述】:邮递员
我的标题“Content-Type”是“application/json”,我用 JSON 原始发送它, 看起来像这样...
"category": "House Maintenance"
应用程序
Category.java(模型)
@Data
@Entity
@Table(name = "Categories")
public class Category implements Serializable
private static final long serialVersionUID = -8577891700634111561L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "category", nullable = false)
private String category;
public Category(String category)
super();
this.category = category;
public Category()
CategoryServiceImpl.java(保存方法)
@Override
public void save(Category newCategory)
categoryRepository.save(newCategory);
CategoryController.java(请求)
@RequestMapping(value = "/categories", method = RequestMethod.POST)
public void addCategory(@RequestBody String categoryName)
Category newCategory = new Category(categoryName);
categoryService.save(newCategory);
【问题讨论】:
【参考方案1】:您在控制器方法中将请求转换为字符串,因此您会收到整个请求正文并将类别字段设置为整个 json 字符串。
您想要做的是 Spring Boot 已经为您提供了转换后的 dto:
@RequestMapping(value = "/categories", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void addCategory(@RequestBody Category category)
categoryService.save(category);
如果您不想将实体与请求耦合,则需要引入一个额外的类,例如CreateCategoryDto
:
@Data
public class CreateCategoryDTO
@JsonProperty(value = "category")
private String category;
(我假设您使用的是 Lombok 和 Jackson。添加注释 @JsonProperty(value = "category")
仅用于说明如何将 Java 字段名称与 Json 名称分离。)
然后控制器变成
@RequestMapping(value = "/categories", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void addCategory(@RequestBody CreateCategoryDto categoryDto)
Category newCategory = new Category(categoryDto.getCategory());
categoryService.save(newCategory);
【讨论】:
我返回并将我的“RequestBody”更改为“Category”对象而不是字符串,并将“@JsonProperty”添加到“Category”模型中以避免创建额外的类。但是,我不需要添加“consumes = MediaType.APPLICATION_JSON_VALUE”。感谢您的帮助,我很感激! 很高兴我能帮上忙,如何支持我的答案? MediaType 注释不是解决您的问题所必需的,但它是一种很好的做法。只有 JSON 请求将被发送到端点(方法),这是有道理的,因为只有这些请求才能正确转换为 dto。 我愿意,但我投票的声望不到 15。对不起。【参考方案2】:回答
感谢拉尔夫瓦格纳,我回去并将我的方法更改为以下。
//Old
method(@RequestBody String category)
//New
method(@RequestBody Category category)
我在“类别”模型中添加了“@JsonProperty”以避免创建额外的类。
//Old
@Column(name = "category", nullable = false)
private String category;
//New
@Column(name = "category", nullable = false)
@JsonProperty(value = "category")
private String category;
我的数据库现在可以正确存储了。
【讨论】:
以上是关于Spring boot 的 Postman Post 请求保存了整个 JSON 正文,而不仅仅是字段值。我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
从使用 Angular 7 的请求中接收 Spring Boot 中的空授权标头,但 Postman 工作正常
所有页面都在 Postman 中使用 Maven 为 Spring Boot 应用程序提供 404 错误
syntax error, expect {, actual error, pos 0出错调试
通过 Axios 发送一个 post 请求是在 Spring-Boot 后端生成一个空的 RequestBody。在 Postman 中工作,但不能通过 Axios 发布请求