Возникла проблема, из-за которой вызов 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.




Я только что сравнил свой текущий проект, и единственное различие, которое я вижу, основано на том, как вы передали тело запроса, можете ли вы попробовать заменить строку:
.body(Mono.just(login),Login.class)
к
.bodyValue(login)
С уважением,
WebClient использует библиотеку Jackson для кодирования полезной нагрузки контента. Кодирование делегируется от WebClient к Jackson через Jackson2JsonEncoder. Jackson2JsonEncoder использует ObjectMapper (компонент, который действует как API высокого уровня для библиотеки Jackson) для сериализации вашего класса в текстовое представление JSON.
И проблема в том, что ваш класс Login нельзя сериализовать в JSON в его текущей форме.
Вы можете сделать одно из следующих действий:
getLogin(), getPassword() и т. д.Login с class на record@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();
Спасибо. Большое спасибо. Эти опции работают нормально и работают так, как ожидалось.
Я не заметил проблемы с геттером/сеттером, потому что привыкал к ломбоку. Хороший улов
Большое спасибо . Я также пробовал эту опцию bodyValue, и она не работает. В основном он не передает объект входа, так как в ответ я получаю пустое сообщение об ошибке. Я пробовал несколько вариантов.