1

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

org.springframework.context.ApplicationContextException: Невозможно запустить встроенный контейнер; Вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем «embeddedServletContainerFactory»: Ошибка создания бина; Вложенное исключение - 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 
... 

Update:

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

ответ

1

Использование spring-boot-starter-actuator зависимости вместе с management.port определяется в application.properties причин, начиная встроенный контейнер TOMCAT потерпеть неудачу.

Снятие management.port определение свойства от application.properties Запускает приложение снова.

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

0

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

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

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