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 发布请求

Spring boot 的 Postman Post 请求保存了整个 JSON 正文,而不仅仅是字段值。我该如何解决?

Spring boot 3问题:为什么不能使用Postman和Frontend调用API调用API,然后得到空数组?