如何以JSON格式发送Integer值并在REST Controller中接收?

时间:2018-11-21 12:09:43

标签: java json spring spring-boot spring-restcontroller

我有一个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类,甚至不想使用查询/路径参数发送数据。

6 个答案:

答案 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"));
}