Проблема с веб-клиентом Spring Webflux, при попытке отправить запрос по почте ничего не происходит - PullRequest
1 голос
/ 26 мая 2019

Имеют следующую реализацию веб-клиента:

    public <T> WebClient.ResponseSpec sendRequest(HttpMethod method, String contentType, T body, String baseUrl, String path) {
    try {
        WebClient webClient = WebClient.builder().baseUrl(baseUrl).filter(logRequest()).build();
        WebClient.ResponseSpec responseSpec = webClient.method(method)
                .uri(path)
                .header(HttpHeaders.CONTENT_TYPE, contentType)
                .body(BodyInserters.fromObject(body))
                .retrieve();
        return responseSpec;
    } catch (Exception e) {
        throw new WebClientProcessingException("Exception when trying to execute request", e);

    }
}

// This method returns filter function which will log request data
private static ExchangeFilterFunction logRequest() {
    return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
        LOGGER.info("Request: {} {} {}", clientRequest.method(), clientRequest.url(), clientRequest.body());
        clientRequest.headers().forEach((name, values) -> values.forEach(value -> LOGGER.info("{}={}", name, value)));
        return Mono.just(clientRequest);
    });
}

Также имеется следующий код, который создает объект пользователя и команду, которая содержит объект пользователя, а затем вызывает веб-клиента для отправки запроса

@Autowired
private BaseWebClient baseWebClient;
@Override
public void saveOrUpdateUser() {
        UserPayload userPayload = new UserPayload();
        userPayload.setUserId(111L);
        userPayload.setCreatedAt(ZonedDateTime.now(DateTimeProps.systemTimeZone));
        UserCommand userCommand = new UserCommand();
        userCommand.setUser(userPayload);
        baseWebClient.sendRequest(HttpMethod.POST, "application/json",
            Stream.of(userCommand).collect(Collectors.toList()),
            "http://localhost:8080",
            "/users").onStatus(HttpStatus::isError, clientResponse -> {
        throw new WebClientUserSaveOrUpdateeFailedException("Exception when trying to update user state")
        .bodyToMono(String.class);
    });
}

Полезная нагрузка пользователя:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserPayload {
  Long userId;
  ZonedDateTime createdAt;
}

Пользовательская команда:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserCommand {
     @JsonProperty("user")
     UserPayload user;
}

Json, который ждет другого моего приложения (которому я отправляю запрос):

[
  { "user":
            { 
              "userId": 1,
              "createdAt": "2019-05-16T08:24:46.412Z"
            } 
  }
]

Использование: Spring boot 2, Lombok (для getter / setter), gradle Когда я пытаюсь отправить запрос, ничего не происходит. Даже не исключение. Я попробовал с очень простым делом, а также ту же проблему. Еще одно замечание, возможно ли зарегистрировать тело? Я имею в виду как-то увидеть окончательный JSON Я предполагаю, что пропускаю что-то общее.

1 Ответ

3 голосов
/ 26 мая 2019

В Reactor, ничего не происходит, пока вы не подпишетесь .retrive() фактически не запускает запрос.Как вы можете видеть в примере , вы должны использовать один из методов для преобразования ResponseSpec в Publisher, а затем в конце концов подписаться на этого издателя.

В зависимости от того, как вы используете этот метод, вы можете позволить Spring подписаться на издателя.WebFlux поддерживает реактивные типы в модели, что означает, что вы можете напрямую возвращать Mono из ваших методов RestController, например.

...