У меня есть один контроллер 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.




Создайте класс pojo, как показано ниже.
public class Mobile{
private Integer mobile;
//getter and setter
}
А потом
public void otp(@RequestBody Mobile mobile)
распечатать значение использовать
mobile.getMobile();
Я не хочу отправлять данные в параметре запроса. Я хочу отправлять только через тело JSON.
Хотя такой класс - один из возможных вариантов, OP хочет иметь целое число, а не нить!
спасибо за исправление .. в одном месте вопроса он тоже упомянул строку.
Я не хочу создавать дополнительный класс POJO для одного атрибута / значения. Если у нас есть потребность в 100 классах, тогда нам не нужно создавать 100 классов POJO. И даже я не хочу отправлять данные в качестве параметра запроса или пути. Кроме них, если есть какое-то решение, скажите мне.
Вы можете использовать класс в качестве тела запроса:
class Request {
public Integer mobile;
}
и укажите такой параметр:
public void otp(@RequestBody Request mobile) {
...
Я не хочу создавать дополнительный класс для одного атрибута / значения. Если у нас есть потребность в 100 классах, тогда нам не нужно создавать 100 классов POJO.
@Altaf В реальной ситуации несколько необычно иметь 100 классов POJO для одного поля. См. Ответ AokoQin, в котором предлагается иметь один общий класс, или более четко объясните свою ситуацию.
если у вас есть 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 (но не рекомендуется)
Это разумный ответ, учитывая, что вопрос не очень разумный.
Просто отправьте номер в формате JSON. 12345 используйте @RequestBody, чтобы получить целое число. это будет работать. Я использую почтальона для отправки в формате RAW JSON.
Кстати, я новичок в изучении Spring Boot.
Я бы сказал: вместо
{ "mobile" : 123456 }просто отправьте123456как тело HTTP. В качестве альтернативы создайте классMobileс полемIntegerи используйте его в качестве параметра метода.