Запрос Spring WebClient POST, похоже, не работает при передаче объектов домена

Возникла проблема, из-за которой вызов WebClient завершается сбоем при передаче объекта домена, но передача в виде строки JSON работает:

Это работает :

String req = "{\n" +
            "\"Login\": \"1121\",\n" +
            "\"Password\": \"1212=121\",\n" +
            "\"Domain\": \"corpdev.net\"\n" +
            "}";
String respo=webClient.post()
                .uri("https://sssss.com")
                .contentType(MediaType.APPLICATION_JSON)
                .bodyValue(req)
                .retrieve()
                .bodyToMono(String.class)
                        .block();

но то же самое с использованием объекта домена не работает:

String resp = webClient
                .post()
                .uri("https://sssss.com")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON )
                .body(Mono.just(login),Login.class)
                .retrieve()
                .bodyToMono(String.class)
                .block();
public class Login {
    private String Login;
    private String Password;
    private String Domain;
}

Я немного новичок в Webflux и, похоже, не могу заставить это работать. Кажется, мне не хватает чего-то простого. Я ожидал, что второй вариант будет работать, поскольку он кажется прямолинейным, но значение объекта, похоже, не отправляется на вызов Rest.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я только что сравнил свой текущий проект, и единственное различие, которое я вижу, основано на том, как вы передали тело запроса, можете ли вы попробовать заменить строку:

.body(Mono.just(login),Login.class)

к

.bodyValue(login)

С уважением,

Большое спасибо . Я также пробовал эту опцию bodyValue, и она не работает. В основном он не передает объект входа, так как в ответ я получаю пустое сообщение об ошибке. Я пробовал несколько вариантов.

TXTech 06.06.2023 06:16
Ответ принят как подходящий

WebClient использует библиотеку Jackson для кодирования полезной нагрузки контента. Кодирование делегируется от WebClient к Jackson через Jackson2JsonEncoder. Jackson2JsonEncoder использует ObjectMapper (компонент, который действует как API высокого уровня для библиотеки Jackson) для сериализации вашего класса в текстовое представление JSON.

И проблема в том, что ваш класс Login нельзя сериализовать в JSON в его текущей форме. Вы можете сделать одно из следующих действий:

  1. генерировать геттеры в вашем классе, такие как getLogin(), getPassword() и т. д.
  2. если вы используете последнюю версию Java, вы можете изменить Login с class на record
  3. вместо создания геттеров вы можете аннотировать поля аннотацией @JsonProperty

Любой из трех приведенных выше пунктов действует как подсказка Jackson (библиотека, выполняющая фактическое кодирование), как сериализовать ваш класс в JSON.

Кроме того, в Java принято начинать имена полей классов с нижнего регистра.

Итак, если ваш Login теперь является record, вы можете использовать его с WebClient вот так

String respo = webClient.post()
                .uri("https://sssss.com")
                .contentType(MediaType.APPLICATION_JSON)
                .bodyValue(new Login("Login","Password","Domain")
                .retrieve()
                .bodyToMono(String.class)
                .block();

Спасибо. Большое спасибо. Эти опции работают нормально и работают так, как ожидалось.

TXTech 07.06.2023 20:48

Я не заметил проблемы с геттером/сеттером, потому что привыкал к ломбоку. Хороший улов

cyril wirth 08.06.2023 05:23

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