Встроенный tomcat не запускается при обновлении с Spring Boot 1.3.3 -> 1.3.5

Приложение Spring Boot не запускается после обновления с 1.3.3 до 1.3.5. Spring не удается запустить встроенный контейнер (Tomcat 8), и отображается следующее сообщение об ошибке:

org.springframework.context.ApplicationContextException: невозможно запустить встроенный контейнер; вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «embeddedServletContainerFactory»: создание экземпляра bean-компонента не удалось; вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [wad.config.HttpsConfiguration$1]: конструктор по умолчанию не найден; вложенным исключением является java.lang.NoSuchMethodException: wad.config.HttpsConfiguration$1.()

По сути, это сообщение об ошибке говорит, что не может создать embeddedServletContainerFactory, но мне не ясно, к чему относится [wad.config.HttpsConfiguration$1]. Сам класс конфигурации Java находится в пакете wad.config и называется HttpsConfiguration. Я попытался добавить пустой конструктор в свой HttpsConfiguration.java, но это не помогло.

Вот соответствующие части моего POM:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.5.RELEASE</version>
    <relativePath/>
</parent>

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

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

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

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <type>jar</type>
    </dependency>

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

Мой класс приложения:

@EntityScan(
    basePackageClasses = {Application.class, Jsr310JpaConverters.class}
)
@SpringBootApplication
@Import({DevProfile.class})
public class Application {

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

А вот моя конфигурация для перенаправления портов с 8080 -> 8443 (настраивается через application.properties):

@Configuration
public class HttpsConfiguration {

@Value("${server.port}")
private int httpsPort;

@Value("${server.port.http}")
private int httpPort;


@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
        @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(initiateHttpConnector());
    return tomcat;
}

// redirect from (http) port to (https) if https is enabled.
private Connector initiateHttpConnector() {
    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    connector.setPort(httpPort);
    connector.setSecure(false);
    connector.setRedirectPort(httpsPort);
    return connector;
}

Конфигурация application.properties:

...
#Actuator port
management.port = 9001

#HTTPS port
server.port=8443 
#HTTP port
server.port.http=8080 
#Enable SSL
server.ssl.enabled=true
...

Обновлять:

Проблема может быть воспроизведена с проектом Spring Boot 1.3.5, настроенным с указанными выше классами POM, application.properties и HttpSecurity & Application.


person Laurenzo    schedule 07.06.2016    source источник


Ответы (2)


Использование spring-boot-starter- привод вместе с management.port, определенным в application.properties, приводит к сбою запуска встроенного контейнера tomcat.

Удаление определения свойства management.port из application.properties приводит к тому, что приложение снова запускается.

Стоит отметить, что при удалении свойства исправлена ​​проблема, непонятно почему.

person Laurenzo    schedule 16.06.2016

Решение этой проблемы можно найти здесь:

https://github.com/spring-projects/spring-boot/issues/6193

и создание отдельного класса, расширяющего TomcatEmbeddedServletContainerFactory, и в этом классе есть общедоступный конструктор этого класса super. Класс, расширяющий TomcatEmbeddedServletContainerFactory, не может быть внутренним классом, он должен быть в своем собственном файле и общедоступным в пакете, иначе ошибка не исчезнет.

person cobolserverpages    schedule 30.04.2017