web-dev-qa-db-ja.com

TomcatEmbeddedServletContainerFactoryがSpring Boot 2にありません

org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainerFactoryを使用するSpring Bootアプリケーションバージョン1.5.xがあり、Spring Boot 2に移行しようとしていますが、org.springframework.boot:spring-boot-starter-Tomcatに依存しているにもかかわらず、アプリはコンパイルされません。コンパイラは以下のエラーを発行します。

error: package org.springframework.boot.context.embedded.Tomcat
46
Anton Krosnev

このクラスは削除され、org.springframework.boot.web.embedded.Tomcat.TomcatServletWebServerFactoryに置き換えられました。詳細については、 Spring-Boot-2.0-Migration-Guide を参照してください。

リアクティブユースケースをサポートするために、組み込みコンテナパッケージ構造が大幅にリファクタリングされました。 EmbeddedServletContainerはWebServerに名前が変更され、org.springframework.boot.context.embeddedパッケージはorg.springframework.boot.web.serverに再配置されました。同様に、EmbeddedServletContainerCustomizerはWebServerFactoryCustomizerに名前が変更されました。

たとえば、TomcatEmbeddedServletContainerFactoryコールバックインターフェイスを使用して埋め込みTomcatコンテナをカスタマイズしている場合、TomcatServletWebServerFactoryを使用する必要があり、EmbeddedServletContainerCustomizer Beanを使用している場合は、WebServerFactoryCustomizer Beanを使用する必要があります。

より大きなリクエストを送信する必要があるという問題があり、デフォルトのサイズで許可されていました:

@Bean
    public TomcatServletWebServerFactory containerFactory() {
        return new TomcatServletWebServerFactory() {
            protected void customizeConnector(Connector connector) {
                int maxSize = 50000000;
                super.customizeConnector(connector);
                connector.setMaxPostSize(maxSize);
                connector.setMaxSavePostSize(maxSize);
                if (connector.getProtocolHandler() instanceof AbstractHttp11Protocol) {

                    ((AbstractHttp11Protocol <?>) connector.getProtocolHandler()).setMaxSwallowSize(maxSize);
                    logger.info("Set MaxSwallowSize "+ maxSize);
                }
            }
        };

    }
41
Anton Krosnev

Springブート 2.0.0.RELEASE では、次のコードに置き換えることができます。

@Bean
public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory Tomcat = new TomcatServletWebServerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };
    Tomcat.addAdditionalTomcatConnectors(redirectConnector());
    return Tomcat;
}

private Connector redirectConnector() {
    Connector connector = new Connector("org.Apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    connector.setPort(8080);
    connector.setSecure(false);
    connector.setRedirectPort(8443);
    return connector;
}
57
Rajim

素晴らしいThx!私はこの記事から来ました: https://blog.swdev.ed.ac.uk/2015/06/24/adding-embedded-Tomcat-ajp-support-to-a-spring-boot-application/

スプリングブート2.1.3を使用:

@Configuration
@Data
public class TomcatConfiguration {

@Value("${Tomcat.ajp.port}")
int ajpPort;

@Value("${Tomcat.ajp.remoteauthentication}")
String remoteAuthentication;

@Value("${Tomcat.ajp.enabled}")
boolean tomcatAjpEnabled;

@Bean
public TomcatServletWebServerFactory servletContainer() {

    TomcatServletWebServerFactory Tomcat = new TomcatServletWebServerFactory();
    if (tomcatAjpEnabled)
    {
        Connector ajpConnector = new Connector("AJP/1.3");
        ajpConnector.setPort(ajpPort);
        ajpConnector.setSecure(false);
        ajpConnector.setAllowTrace(false);
        ajpConnector.setScheme("https");
        Tomcat.addAdditionalTomcatConnectors(ajpConnector);
    }

    return Tomcat;
  }

}
3
womd