尝试将JSON发布到方法中,最终出现此错误-所需的字符串参数'name'不存在

问题描述 投票:0回答:3

我知道在问这个问题之前找不到完全相同的问题,我是弹簧技术的新手,所以请保持温柔]]

我正在尝试使用应该添加到数据库中的邮递员发布对象

对象构造函数看起来像这样

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是我用来将Object添加到我的数据库调试器的函数,但未到达该语句。这就是我发布JSON对象的过程

Header

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,则您的PostProduct类应如下所示(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类型,前提是指定了适当的Java类型。默认情况下,我们用@RequestBody注释注释的类型必须与从客户端控制器发送的JSON相对应。

确保您的类遵守Java Bean规范

我在寻找答案的两天后找到了解决方案

显然,您需要放置一个Response实体以确保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);
}

对不起,麻烦

spring post http-post postman spring2.x
3个回答
0
投票

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


0
投票

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

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


0
投票

我在寻找答案的两天后找到了解决方案

显然,您需要放置一个Response实体以确保Spring能够正确处理POST命令

© www.soinside.com 2019 - 2024. All rights reserved.