Spring 启动 - 没有嵌入的 Rest Call 客户端 tomcat

Spring boot - Rest Call client without embedded tomcat

我一直在尝试找出 spring 引导的问题,因为我是 spring 的新手,所以我想在这里寻求帮助。

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

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

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

但在对禁用嵌入式进行了一些研究后 tomcat,我找到了解决方案。

要进行以下更改,

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

& 在 application.yml

spring:
   main:
      web-environment: false

随着 application.yml 的变化,我的 jar 甚至没有启动,直接中止,甚至没有在 logback 日志中记录任何内容。

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

 [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. 回答您的第一个问题,是的,您需要一个嵌入式 tomcat 或 码头或需要将您的应用程序部署到外部应用程序 服务器。
  2. 其次,要摆脱你面临的异常,不要排除 EmbeddedServletContainerAutoConfiguration 和 WebMvcAutoConfiguration class 因为默认嵌入需要它 tomcat 自动配置。

回答您的问题:

1) 默认嵌入 - 客户端 HTTP 请求不需要;

2) 您可以将 CommandLineRunner 用于 spring 引导应用程序而无需任何 web:

@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {

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

    @Override
    public void run(String... args) {
        // TODO: start you thread here to execute client HTTP REST requests (or any other job you need)
    }
}

这将完全禁用网络 - 手动错误配置没有问题。

这是一些文档: http://www.baeldung.com/spring-boot-console-app

您还需要将 spring-boot-starter-web 依赖项替换为 spring-boot-starter:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

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

最好从常规命令行客户端模板开始,然后从那里开始,详见 relevant Spring Guide

基本上应用程序减少到

@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 到

    <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>

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

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

spring.main.web-application-type=none

已修复。

这对我来说是最简单的解决方案,让 spring 启动应用程序只是一个 restful api 消费者。

替换依赖

implementation("org.springframework.boot:spring-boot-starter-web")

implementation("org.springframework.boot:spring-boot-starter-json")

RestTemplatejackson在没有嵌入的项目中可用tomcat。