尝试 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);
}
抱歉给您带来麻烦
我知道这个问题之前被问过,但找不到完全相同的问题,而且我是 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);
}
抱歉给您带来麻烦