尝试 post JSON 方法以此错误结束 - 不存在必需的字符串参数 'name'

Trying to post JSON to a method end up with this error - Required String parameter 'name' is not present

我知道这个问题之前被问过,但找不到完全相同的问题,而且我是 spring 技术的新手,所以请温柔点

我正在尝试 post 使用 postman 的对象应该添加到我的数据库中

对象构造函数如下所示

public PostedProduct(String name, long price) {
  super(name, price, UUID.randomUUID());
  }

映射函数是这个

static final String path = "/Products";

@RequestMapping(method = RequestMethod.POST , value = path) 
public void setProducts(@RequestParam("name") String name, @RequestParam("price") long price){
  service.setProduct(new PostedProduct(name,price));
}

SetProduct 是我用来将对象添加到我的数据库的函数,调试器未达到该语句。 这就是我对 post 我的 JSON 对象

所做的

以下是报错信息

"message": "Required String parameter 'name' is not present",

我尝试将功能更改为此并尝试了一些其他组合

@PostMapping(path)
public void setProducts(@RequestBody PostedProduct product)
{
   service.setProduct(product);
}

除了错误消息外没有任何变化

"message": "Required request body is missing: public void  Controllers.MarketController.setProducts(Moldels.ProductModel.PostedProduct)"

我不是在寻找便宜的解决方案,而是在尝试了解原因。如果有人愿意帮忙我可以提供更多细节

如果您使用 @RequestParam,您的 URI 应该如下所示(这意味着您没有使用 HTTP 正文):

http://localhost:8080/Products?name=book&price=12000

如果您在 HTTP 正文示例中使用 @RequestBody,您的 PostedProduct class 应该如下所示(URI 现在是 http://localhost:8080/Products):

public class PostedProduct {

    private String name;
    private long price;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public long getPrice() {
        return price;
    }

    public void setPrice(long price) {
        this.price = price;
    }
}

请注意,如果您希望 Spring 正确反序列化您的 JSON

,则不带参数的构造函数和 setter 方法是必需的

@RequestBody 注释将 HttpRequest 主体映射到传输或域对象,从而使入站 HttpRequest 主体自动反序列化到 Java 对象

Spring 会自动将 JSON 反序列化为 Java 类型,前提是指定了适当的类型。默认情况下,我们用@RequestBody 注解注解的类型必须对应于从我们的客户端控制器发送的JSON。

确保您的 class 遵守 java bean 规范

经过 2 天的寻找答案,我找到了解决方案

显然您需要放置一个响应实体以确保 Spring 正确处理 POST 命令

@RequestMapping(value = "/Product" , method = RequestMethod.POST , consumes = MediaType.APPLICATION_JSON_VALUE)
   public ResponseEntity<Product> setPruduct(@RequestBody PostedProduct product )
   {
      service.setProduct(product);
      return new ResponseEntity<Product>(HttpStatus.OK);
   }

像这样或者简单地注释 HTTP 状态就可以了像这样

@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/Product" , method = RequestMethod.POST , consumes = MediaType.APPLICATION_JSON_VALUE)
public void setPruduct(@RequestBody PostedProduct product )
{
service.setProduct(product);
}

抱歉给您带来麻烦