Я пытаюсь перенести свое клиентское приложение 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);
}
}
Любые идеи?
@Toerktumlare Это странно. У меня есть другой класс, в котором я использую RestTemplate таким же образом, и я не получаю ошибку. Но установка приложения без веб-сервера помогла! Пожалуйста, опубликуйте это как ответ, и я отмечу его как правильный. Благодарю вас!
я не могу проверить ваше «другое приложение», поэтому я не могу комментировать это.
По умолчанию весенняя загрузка запускается либо как веб-приложение, либо как реактивное приложение, в зависимости от того, какие библиотеки у вас есть в вашем пути к классам.
Но вы также можете указать фреймворку не запускать веб-сервер, явно установив WebApplicationType
на None
вот пример:
new SpringApplicationBuilder(MainApplication.class)
.web(WebApplicationType.NONE)
.run(args);
или вы можете установить его в свойствах приложения:
spring.main.web-application-type=none
Вы можете прочитать больше об этом здесь:
@SpringBootApplication
— это веб-приложение, работающее на веб-сервере по умолчанию. Это и есть. И webclient, и resttemplate являются просто оболочками для веб-серверов HttpClient. Ваше приложение RestTemplate, скорее всего, также запускает веб-сервер, если вы не сказали ему не делать этого. Вы можете настроить его так, чтобы сервер не запускался. baeldung.com/spring-boot-no-веб-сервер