web-dev-qa-db-ja.com

SpringBoot-Tomcatが埋め込まれていないRestCallクライアント

私はスプリングブーツの問題を解明しようとしてきましたが、春が初めてなので、ここで助けを求めることを考えました。

スプリングブートベースのJavaアプリケーションがデーモンとして実行され、リモートサーバーにGETリクエストを送信します(クライアントとしてのみ機能します)。

しかし、私のSpring Bootアプリケーションは、組み込みのTomcatコンテナを内部的に起動します。私の理解では、Javaアプリがサーバーとして機能する場合、Tomcatが必要になります。しかし、私のアプリケーションはリモートマシンのGET APIのコンシューマーにすぎないのに、なぜ組み込みのTomcatが必要なのですか?

私のpomファイルでは、GET呼び出しを行うためにも必要であると想定して、spring-boot-starter-webを指定しました。

しかし、組み込みTomcatの無効化について調査した後、解決策を見つけました。

以下の変更を行うには、

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

&application.yml内

spring:
   main:
      web-environment: false

Application.ymlの変更により、私のjarは開始されておらず、ログバックログに何も記録せずに直接中止されます。

ここで、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呼び出しを実行するにはどうすればよいですか?

7

ここでは、Webアプリケーションのテンプレートから始めて、Webアプリケーションの側面をオフにしようとしているため、完全に間違った方向に進んでいるようです。

関連する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 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>
3
jwenting

あなたの質問に答える:

1)defautによって埋め込まれます-クライアントのHTTPリクエストには必要ありません。

2)WebなしでSpringBootアプリケーションに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)
    }
}

これにより、Webが完全に無効になります。手動での設定ミスによる問題はありません。

ここにいくつかのドキュメントがあります: 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>
0
alexey28

私はこの問題を抱えていました。私が望んでいたのは、クライアントにRESTリクエストを作成させることでした。残念ながら、Jettyを埋め込む依存関係があり、Jettyは常に起動されていました。

Jettyを無効にするために必要なのは、applications.propertiesに次のエントリを追加することだけでした。

spring.main.web-application-type=none

それはそれを修正しました。

0
BuckBazooka