弹簧启动 - 不带嵌入式 tomcat 的 Rest Call 客户端

我一直试图找出弹簧靴的问题,因为我是春天的新手,我想在这里得到一些帮助。

我有一个基于弹簧引导的java应用程序,它作为守护程序运行,并向远程服务器发出一些GET请求。(仅作为客户端)。

但是我的弹簧启动应用程序在内部启动了一个嵌入式tomcat容器。我的理解是,如果java应用程序充当服务器,它将需要tomcat。但是我的应用程序只是远程机器的GET API的消费者,为什么它需要一个嵌入式tomcat?

在我的pom文件中,我指定了spring-boot-starter-web,假设甚至进行GET调用都需要它。

但是在做了一些关于禁用嵌入式tomcat的研究之后,我找到了一个解决方案。

要进行以下更改,

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
WebMvcAutoConfiguration.class})

& in application.yml

spring:
   main:
      web-environment: false

随着 application.yml 的更改,我的 jar 甚至没有开始,直接中止,甚至没有在 logback 日志中记录任何内容。

现在,如果我删除appplication.yml更改,我的jar将启动(仅在@SpringBootApplication年中的第一次更改),但会出现一些异常。

 [main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

我在这里的疑虑是,

1)tomcat,无论是独立的还是嵌入式的,对于一个只对远程机器进行GET API调用的应用程序来说,真的需要吗?

2)我如何克服这个异常并安全地删除嵌入的tomcat,同时仍然执行GET API调用?


答案 1

您似乎完全走错了路,从Web应用程序模板开始,然后尝试关闭Web应用程序方面。

从常规命令行客户端模板开始并从那里开始要好得多,如相关的Spring指南中所述。

基本上,应用程序减少到

@SpringBootApplication
public class Application {

private static final Logger log = LoggerFactory.getLogger(Application.class);

public static void main(String args[]) {
    SpringApplication.run(Application.class);
}

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.build();
}

@Bean
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
    return args -> {
        Quote quote = restTemplate.getForObject(
                "http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
        log.info(quote.toString());
    };
}
}

和 pom to

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
</dependencies>

答案 2

我有这个问题。我想要的只是让一个客户端发出REST请求。不幸的是,我有一个依赖关系,它嵌入了Jetty,而Jetty总是启动的。

为了禁用 Jetty,我需要做的就是在 applications.properties 中添加以下条目:

spring.main.web-application-type=none

这修好了。


推荐