Как отправить целочисленное значение в формате JSON и получить в REST Controller?

У меня есть один контроллер 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. Как выполнить мое требование?

NOTE: I don't want to create any additional POJO class or even I don't want to send the data using query/path parameter.

Я бы сказал: вместо { "mobile" : 123456 } просто отправьте 123456 как тело HTTP. В качестве альтернативы создайте класс Mobile с полем Integer и используйте его в качестве параметра метода.

Seelenvirtuose 21.11.2018 13:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
22 584
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Создайте класс pojo, как показано ниже.

public class Mobile{
   private Integer mobile;
  //getter and setter
}

А потом

public void otp(@RequestBody Mobile mobile)

распечатать значение использовать

mobile.getMobile();

Я не хочу отправлять данные в параметре запроса. Я хочу отправлять только через тело JSON.

Altaf Ansari 21.11.2018 13:15

Хотя такой класс - один из возможных вариантов, OP хочет иметь целое число, а не нить!

Seelenvirtuose 21.11.2018 13:19

спасибо за исправление .. в одном месте вопроса он тоже упомянул строку.

Alien 21.11.2018 13:21

Я не хочу создавать дополнительный класс POJO для одного атрибута / значения. Если у нас есть потребность в 100 классах, тогда нам не нужно создавать 100 классов POJO. И даже я не хочу отправлять данные в качестве параметра запроса или пути. Кроме них, если есть какое-то решение, скажите мне.

Altaf Ansari 21.11.2018 13:25

Вы можете использовать класс в качестве тела запроса:

class Request {
    public Integer mobile;
}

и укажите такой параметр:

public void otp(@RequestBody Request mobile) {
...

Я не хочу создавать дополнительный класс для одного атрибута / значения. Если у нас есть потребность в 100 классах, тогда нам не нужно создавать 100 классов POJO.

Altaf Ansari 21.11.2018 13:21

@Altaf В реальной ситуации несколько необычно иметь 100 классов POJO для одного поля. См. Ответ AokoQin, в котором предлагается иметь один общий класс, или более четко объясните свою ситуацию.

rougou 12.06.2019 06:33

если у вас есть org.json.JSONObject

 @PostMapping(value = "/otp")
 public void otp(@RequestBody String mobile) {
   JSONObject obj = new JSONObejct(mobile);
   System.out.print(obj.getInt("mobile"));
}
Ответ принят как подходящий

Если вы хотите отправить свое тело как:

{
    "mobile":123456
}

Вы создадите другой объект для получения значения.

Но если вы хотите принять только целочисленное значение без какого-либо другого объекта, вы не будете помещать объект json в тело запроса, а только само целое число.

Body:

12345

Процесс преобразования с помощью json и @RequestBody происходит автоматически, и вам нужно предоставить класс, содержащий правильное поле. Если вы настаиваете на отправке данных по телу запроса, вы можете использовать String для получения данных json как String. Например:

public void test(@RequestBody String request){
        log.info(request);
    }

Таким образом, тело запроса, которое вы получили, представляет собой строку. Вам понадобится другой инструмент, который поможет вам преобразовать его. Например, org.json, вы можете получить дополнительную информацию отсюда HttpServletRequest получить данные JSON POST

Но самый простой способ - создать новый класс для приема данных или изменить @RequestBody на @RequestParam или @Pathvariable.

Если вы все еще хотите использовать json в качестве тела запроса, возможно, вы могли бы создать общий класс A, который будет содержать множество полей, таких как имя, номер телефона, адрес электронной почты ... Затем после того, как вы отправите запрос, который содержит только мобильный телефон, вам просто нужно A.getMobile (). Таким образом, даже если вы получите 100 запросов, вам все равно понадобится один POJO (но не рекомендуется)

Это разумный ответ, учитывая, что вопрос не очень разумный.

rougou 12.06.2019 06:30

Просто отправьте номер в формате JSON. 12345 используйте @RequestBody, чтобы получить целое число. это будет работать. Я использую почтальона для отправки в формате RAW JSON.

Кстати, я новичок в изучении Spring Boot.

Другие вопросы по теме