春季启动-没有嵌入式tomcat的Rest Call客户端

时间:2018-07-24 09:11:53

标签: java spring spring-boot tomcat embedded-tomcat-8

我一直在尝试找出Spring Boot的问题,由于我是Spring的新手,所以我想在这里获得一些帮助。

我有一个基于Spring Boot的Java应用程序,它作为守护程序运行,并向远程服务器发出一些GET请求。 (仅充当客户)。

但是我的spring boot应用程序内部启动了一个嵌入式的tomcat容器。 我的理解是,如果Java应用程序充当服务器,它将需要tomcat。但是我的应用程序只是远程计算机GET API的使用者,为什么它需要嵌入式的tomcat?

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

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

要进行以下更改,

https://graph.microsoft.com/v1.0/sites/root/lists('TeamRequests')/items?filter=fields/AuthorLookupId eq '10'

& 在application.yml

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

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

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

spring:
   main:
      web-environment: false

我的疑惑是

1)对于只向远程计算机进行GET API调用的应用程序,确实需要tomcat(无论是独立的还是嵌入式的)?

2)如何克服此异常并安全地删除嵌入式tomcat并仍然执行GET API调用?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这对我来说是最简单的解决方案,使Spring Boot应用程序成为一个宁静的api使用者。

替换依赖项

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

使用

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

RestTemplatejackson在项目中可用,而没有嵌入式tomcat。

答案 2 :(得分:0)

回答您的问题:

1)由defaut嵌入-客户端HTTP请求不需要;

2)您可以在没有任何网络的情况下将CommandLineRunner用于春季启动应用程序:

@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替换spring-boot-starter-web依赖项:

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

答案 3 :(得分:0)

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

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

spring.main.web-application-type=none

解决了这个问题。

答案 4 :(得分:-1)

根据您的问题,我假设您希望您的应用程序继续在后台运行,并在其生命周期中进行一些调用。如果是这样,那么

  1. 回答第一个问题,是的,您需要嵌入式tomcat或 码头或需要将您的应用程序部署到外部应用程序 服务器。
  2. 第二,要摆脱面对的异常,请不要排除 EmbeddedServletContainerAutoConfiguration和 默认嵌入需要WebMvcAutoConfiguration类 tomcat自动配置。