WebClient неправильно пытается запустить веб-сервер

Я пытаюсь перенести свое клиентское приложение REST на использование WebClient вместо RestTemplate. Но когда я запускаю свой клиентский код, он, по-видимому, пытается запустить веб-сервер и подключиться к порту 8080, что не удается, потому что Tomcat уже работает на этом порту.

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

Вот ошибка, которую я получаю:

***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.

Вот мой тестовый код:

package test.rest.webClient;

import java.util.Map;
import org.apache.hc.core5.net.URIBuilder;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClient.RequestHeadersUriSpec;
import org.springframework.web.reactive.function.client.WebClient.ResponseSpec;
import reactor.core.publisher.Mono;
import test.Path;

@SpringBootApplication
public class WebClientTest implements CommandLineRunner {
  @Override
  public void run(String... args) 
  throws Exception {
    URIBuilder builder = new URIBuilder();
    builder.setScheme("https");
    builder.setHost("marketing.propfinancing.com");
    builder.setPath("/caddata/TXCollin/getByIdAndYear");
    builder.addParameter("id", "37");
    builder.addParameter("year", "2022");

    WebClient client = WebClient.create();
    RequestHeadersUriSpec<?> uriSpec = client.get();
    uriSpec.uri(builder.build());
    uriSpec.header(Path.getApplicationProperties().getProperty("caddata.apiKey.header.name"), 
        Path.getApplicationProperties().getProperty("caddata.apiKey"));
    uriSpec.accept(MediaType.APPLICATION_JSON);
    ResponseSpec responseSpec = uriSpec.retrieve();
    ParameterizedTypeReference<Map<String,Object>> typeReference = new ParameterizedTypeReference<Map<String,Object>>(){};
    Mono<Map<String,Object>> mono = responseSpec.bodyToMono(typeReference);
    Map<String,Object> response = mono.block();
    for( Object key : response.keySet() ) {
      Object value = response.get(key);
      LoggerFactory.getLogger(getClass()).warn(key+":"+value);
    }
  }
  
  public static void main(String[] args) 
  throws Exception {
    SpringApplication.run(WebClientTest.class, args);
  }
}

Любые идеи?

@SpringBootApplication — это веб-приложение, работающее на веб-сервере по умолчанию. Это и есть. И webclient, и resttemplate являются просто оболочками для веб-серверов HttpClient. Ваше приложение RestTemplate, скорее всего, также запускает веб-сервер, если вы не сказали ему не делать этого. Вы можете настроить его так, чтобы сервер не запускался. baeldung.com/spring-boot-no-веб-сервер
Toerktumlare 19.03.2022 19:37

@Toerktumlare Это странно. У меня есть другой класс, в котором я использую RestTemplate таким же образом, и я не получаю ошибку. Но установка приложения без веб-сервера помогла! Пожалуйста, опубликуйте это как ответ, и я отмечу его как правильный. Благодарю вас!

Neil 19.03.2022 20:15

я не могу проверить ваше «другое приложение», поэтому я не могу комментировать это.

Toerktumlare 19.03.2022 21:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
3
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По умолчанию весенняя загрузка запускается либо как веб-приложение, либо как реактивное приложение, в зависимости от того, какие библиотеки у вас есть в вашем пути к классам.

Но вы также можете указать фреймворку не запускать веб-сервер, явно установив WebApplicationType на None

вот пример:

new SpringApplicationBuilder(MainApplication.class)
  .web(WebApplicationType.NONE)
  .run(args);

или вы можете установить его в свойствах приложения:

spring.main.web-application-type=none

Вы можете прочитать больше об этом здесь:

17.1.5. Создайте не веб-приложение

Spring Boot без веб-сервера

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