如果使用@RequestParam
,则您的URI应该如下所示(这意味着您没有使用HTTP正文):
我知道在问这个问题之前找不到完全相同的问题,我是弹簧技术的新手,所以请保持温柔]]
我正在尝试使用应该添加到数据库中的邮递员发布对象
对象构造函数看起来像这样
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对象的过程
以下是错误消息
"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); }
对不起,麻烦
如果使用@RequestParam
,则您的URI应该如下所示(这意味着您没有使用HTTP正文):
@ RequestBody批注将HttpRequest主体映射到传输或域对象,从而允许将入站HttpRequest主体自动反序列化到Java对象上
Spring会自动将JSON反序列化为Java类型,前提是指定了适当的Java类型。默认情况下,我们用@RequestBody注释注释的类型必须与从客户端控制器发送的JSON相对应。
我在寻找答案的两天后找到了解决方案
显然,您需要放置一个Response实体以确保Spring能够正确处理POST命令