我有一个REST控制器,我在其中编写了这段代码
@PostMapping(value = "/otp")
public void otp(@RequestBody Integer mobile) {
System.out.println(" Mobile = "+mobile);
}
我正在使用以下输入从Postman调用此方法
URL : localhost:8080/otp
Body
:
{
"mobile":123456
}
但是我遇到了以下异常
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize instance of java.lang.Integer out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.Integer out of START_OBJECT token
如果我将String作为这样的参数
@PostMapping(value = "/otp")
public void otp(@RequestBody String mobile) {
System.out.println(" Mobile = "+mobile);
}
并将输入传递为
{
"mobile":123456
}
现在它正在控制台中进行如下打印
Mobile = {
"mobile":"123456"
}
但是我只需要这个值123456
。如何达到我的要求?
注意:我不想创建任何其他POJO类,甚至不想使用查询/路径参数发送数据。
答案 0 :(得分:1)
创建如下所示的pojo类。
public class Mobile{
private Integer mobile;
//getter and setter
}
然后
public void otp(@RequestBody Mobile mobile)
使用
打印值mobile.getMobile();
答案 1 :(得分:1)
您可以将类用作请求正文:
class Request {
public Integer mobile;
}
并指定如下参数:
public void otp(@RequestBody Request mobile) {
...
答案 2 :(得分:1)
如果您想像这样发送身体
{
"mobile":123456
}
您将创建另一个对象来接收值。
但是,如果您只想接受不带任何其他对象的整数值,则不会将json对象放在请求正文中,而只会将整数本身放在其中。
Body:
12345
答案 3 :(得分:0)
使用json和@RequestBody进行转换的过程是自动的,需要提供一个包含适当字段的类。如果您坚持按请求正文发送数据,则可以使用String接收String的json数据。例如:
public void test(@RequestBody String request){
log.info(request);
}
通过这种方式,您收到的请求正文是一个字符串。您需要其他一些工具来帮助您进行转换。像org.json一样,您可以从此处HttpServletRequest get JSON POST data
获取更多信息但是最简单的方法是创建一个新类来接收数据或将@RequestBody更改为@RequestParam或@Pathvariable。
如果您仍然想使用json作为请求正文,则可以创建一个通用类A,其中包含很多字段,例如姓名,电话号码,电子邮件...然后在发送仅包含移动设备的请求后,您可以只需要A.getMobile()。这样,即使您收到100个请求,仍然需要一个POJO(但不推荐)
答案 4 :(得分:0)
只需使用JSON发送号码。 12345 使用@RequestBody接收int编号。 它会工作。 我使用邮递员以RAW JSON格式发送邮件。
顺便说一句,我是初学者,学习Spring Boot。
答案 5 :(得分:-1)
如果您有org.json.JSONObject
@PostMapping(value = "/otp")
public void otp(@RequestBody String mobile) {
JSONObject obj = new JSONObejct(mobile);
System.out.print(obj.getInt("mobile"));
}