1

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

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

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

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 是我用来将对象添加到我的数据库调试器的一个函数,它没有达到该语句。这就是我发布我的 JSON 对象所做的事情

标题

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)"

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

4

3 回答 3

0

如果你使用@RequestParam你的 URI 应该是这样的(这意味着你没有使用 HTTP 正文):

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

如果您使用@RequestBodyHTTP 正文示例,您的 PostedProduct 类应该如下所示(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 方法的构造函数

于 2020-06-13T21:44:30.850 回答
0

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

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

确保你的类尊重 java bean 规范

于 2020-06-13T21:54:45.847 回答
0

经过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);
}

抱歉,添麻烦了

于 2020-06-14T17:19:04.920 回答