Получение тела строки из Spring serverrequest

Я пытаюсь получить простую строку из тела запроса, но продолжаю получать ошибки

Обработчик:

@RestController

public class GreetingHandler {


    public Mono<ServerResponse> hello(ServerRequest request) {

        String contentType = request.headers().contentType().get().toString();

        String body = request.bodyToMono(String.class).toString();

        return ServerResponse.ok().body(Mono.just("test"), String.class);



    }
}

Маршрутизатор:

@Configuration
public class GreetingRouter {

    @Bean
    public RouterFunction<ServerResponse> route(GreetingHandler greetingHandler) {

       return RouterFunctions
                .route(RequestPredicates.POST("/hello"),greetingHandler::hello);


    }
}

Запрос работает, я вижу contenType (plainTexT) и получаю ответ в почтальоне, но никак не могу получить тело запроса. Самая распространенная ошибка, которую я получаю, это MonoOnErrorResume. Как преобразовать тело запроса в строку?

пожалуйста, включите первые 2 строки в блок кодирования и последние фигурные скобки

Ashok Kumar N 05.02.2019 10:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
5 183
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Можете ли вы использовать аннотацию @RequestBody?

    public Mono<ServerResponse> hello(@RequestBody String body, ServerRequest request) {
        String contentType = request.headers().contentType().get().toString();
        return ServerResponse.ok().body(Mono.just("test"), String.class);
    }

После добавления @RequestBody я получаю сообщение об ошибке в Router: «метод route в классе org.springframework.web.reactive.function.server.RouterFunct‌​ion не может быть применен к заданным типам;»

MargrathX 05.02.2019 11:22
Ответ принят как подходящий

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

String body = request.bodyToMono(String.class).block();

toString() просто предоставит вам строковое представление вашего объекта Mono.

Вот что делает блок: https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#block--

Обновлять:

Я не знал, что блокировка в потоке http невозможна (уже?). Вот адаптированная версия вашего метода контроллера hello, который печатает «Hello yourInput» на консоли, а также возвращает эту строку в ответе.

        public Mono<ServerResponse> hello(ServerRequest request) {
            Mono<String> requestMono = request.bodyToMono(String.class);
            Mono<String> mapped = requestMono.map(name -> "Hello " + name)
                .doOnSuccess(s -> System.out.println(s));
            return ServerResponse.ok().body(mapped, String.class);
        }

После добавления блока я получаю сообщение об ошибке "java.lang.IllegalStateException: block()/blockFirst()/blockLast() блокируются, что не поддерживается в потоке Reactor-http-nio-2"

MargrathX 05.02.2019 11:24

Отлично работает. Спасибо тебе большое.

MargrathX 05.02.2019 14:55

Что, если мне нужно получить List<String> из их тела. какой тип класса я должен пройти тогда? @Dan_Maff

Shiva kumar 19.10.2021 19:49

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