@RequestBody не сопоставляет JSON с объектом Java - Spring Boot

Я не могу преобразовать свой JSON из тела метода сообщения в свой POJO с @RequestBody внутри моего класса контроллера.

Я отладил ошибку и увидел, что одни поля отображаются, а другие нет. Вот так (ПОЖО):

name: null, typeOfPlan: null, Email: [email protected], PhoneNum: 123456789, Website: test.org, Username: null, password: 1234, что странно.

JSON:

{
    "confirmPassword": "1234",
    "email": "[email protected]",
    "password": "1234",
    "phoneNum": "123456789",
    "name": "Hello world",
    "typeOfPlan": "Test",
    "userName": "user",
    "website": "test.org"
}

Контроллер

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SomeController {

    @Autowired
    private Service foo;

    @CrossOrigin
    @PostMapping(value = "/create")
    private void createAccount(@RequestBody BigFoo bigFoo) {
        foo.createAccount(bigFoo);
    }
}

Отсюда я вызываю свой сервис, затем классы DAO.

ПОЖО

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BigFoo {

    private String name;
    private String typeOfPlan;
    private String email;
    private String website;
    private String phoneNum;
    private String username;
    private String password;
}

Я также пытался разрешить JSON с consumes media type в @PostMapping, но не смог решить эту проблему.

Использование Jackson ObjectMapper также не сработало.

Вы не включили фактическое содержимое JSON.

chrylis -cautiouslyoptimistic- 28.06.2019 19:08

Дай мне одну секунду. Обновлено: я добавил точный формат, в котором они отображаются в моем объекте в режиме отладки. Извините, это мой POJO, а не JSON.

Compiler v2 28.06.2019 19:09

поделитесь JSON, чтобы лучше понять

Arun Prasat 28.06.2019 19:14

Я добавил JSON

Compiler v2 28.06.2019 19:19

Попробуйте добавить метод gettter и setter или используйте ломбок.

Arun Prasat 28.06.2019 19:30

Я попробую ломбок, так как я никогда не использовал его раньше.

Compiler v2 28.06.2019 19:35

У него тот же результат, но я добавлю ломбок к своему вопросу.

Compiler v2 28.06.2019 19:39

В вашем Json, который вы разместили, строки должны быть заключены в двойные кавычки. например "подтвердить пароль": "1234". подтвердите свой Json jsonformatter.curiousconcept.com

user1697575 28.06.2019 20:20

@user1697575 Действительно JSON, я бы приложил сюда скриншот, но не могу.

Compiler v2 28.06.2019 20:30

У меня та же проблема, что и у вас @Compilerv2, но на этот раз странно то, что мои переменные POJO и мой интерфейс написаны одинаково

AKJ 19.04.2021 09:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
10
14 152
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Во-первых, если вы используете Postman, curl etc.., попробуйте отправить json таким образом:

{
    "confirmPassword": "1234",
    "email": "[email protected]",
    "password": "1234",
    "phoneNum": "123456789",
    "name": "Hello world",
    "typeOfPlan": "Test",
    "userName": "user",
    "website": "test.org"
}

Во-вторых, единственное нулевое значение, которое я получаю, это username, потому что вы отправляете его в свой json следующим образом: userName, вы должны проверить, что ваш json совместим с вашим POJO

Нет, я не использую Postman или Curl. Я отправляю его прямо из моего внешнего проекта Angular.

Compiler v2 28.06.2019 19:50

Я не отправлял свой JSON с нулевым значением, я не понимаю, что вы пытаетесь сказать.

Compiler v2 28.06.2019 20:07

Я имел в виду, что имя пользователя имеет заглавную букву N внутри, и из-за этого это не сработало.

Daniel Taub 28.06.2019 20:08

Понятно, но я получил JSON от инспектора Chrome, который выводит console.info(). Так что это не должно сильно влиять на мой JSON, потому что это просто представление JSON. Я никогда не прикасался к нему.

Compiler v2 28.06.2019 20:16

Я считаю, что проблема связана с типом контента! установите его на application/json. Укажите его в postman или curl.

если вы отправите его с помощью js, попробуйте этот пример

axios.post(
                "/rest/yoururl",
                jsObject
            ).then(
                function (response) {
                    console.info(response.data);
                }.bind(this)
            );

по умолчанию тип содержимого json

по завитку:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://url

В постмане:

Headers-> put key Content-Type -> value application/json. If you are in postman

Где мне найти content-type, чтобы я мог установить его на application/json?

Compiler v2 28.06.2019 19:59

Заголовки-> поставить ключ Content-Type -> значение application/json. Если вы в почтальоне

Alex 28.06.2019 20:01

Я понятия не имею, куда поместить это в свой проект, опять же, у меня нет почтальона, Curl или любого другого приложения, которое имеет дело с тем, что вы говорите. Я отправил JSON вручную, введя форму из моего внешнего проекта и отправив ее.

Compiler v2 28.06.2019 20:12

упс, это проблема. Проверьте, что такое Content-type в браузере, затем

Alex 28.06.2019 20:15

Где это в моем браузере? Я не могу найти его, как сказано здесь: stackoverflow.com/questions/15148497/… Я смотрю на вкладку своей сети в инспекторе.

Compiler v2 28.06.2019 20:21

в хроме: щелкните правой кнопкой мыши -> проверьте элемент -> вкладка сети -> когда вы нажмете кнопку в своей форме, будет отправлен некоторый запрос, который появится в журнале -> щелкните по нему -> посмотрите его заголовки -> готово

Alex 28.06.2019 22:53

Я думаю, вам нужно что-то прочитать о типах контента, чтобы иметь возможность использовать это в своей работе. Это нормально, что вы не являетесь фронтенд-разработчиком, но вы пишете код, который будет использоваться фронтендом, и вам нужно знать, как он может передавать данные на сервер, а на самом деле есть только пара популярных типов контента, вы легко их запомните (некоторые используются по умолчанию в формах, другие используются по умолчанию, когда вы делаете запрос ajax с определенным методом). developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST

Alex 28.06.2019 23:06
Ответ принят как подходящий

Моя проблема была проста: мои переменные в моем проекте Angular, отправляющие данные в мое приложение Spring Boot, были написаны с ошибкой и, следовательно, не были распознаны моим внутренним приложением и, следовательно, не были правильно сопоставлены с моим POJO.


После того, как я изменил переменные формы внешнего интерфейса, чтобы они соответствовали переменным моего POJO, я получил следующее:

данные POJO

name: It's good now, typeOfPlan: 2 Year, Email: [email protected], PhoneNum: 123456789, Website: test.org, Username: Master, password: 1234

Spring Boot не удалось сопоставить name, typeOfPlan и Username из JSON, потому что они просто не совпадали с теми, что есть в моем бэкенде.


До

Name, typeOfPlan, userName

После

name, type, username

Спасибо всем!

У меня действительно была такая же проблема, и я не могу поверить, что не заметил ее. В моем запросе был «пароль» с 3-мя буквами, и мои глаза просто не могли его увидеть: «пароль». Я рад, что вы опубликовали это, потому что это заставило меня вернуться и перепроверить.

Marnee 05.03.2021 22:11

В моем случае данные были заключены в такие скобки — {данные}. Хорошо дважды проверить структуру, является ли она массивом или объектом.

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