Пружинная загрузка 2.2 с врезанным tomcat 8.5 не запускается. disableRegistry не существует - PullRequest
0 голосов
/ 14 апреля 2020

В моем приложении мы вынуждены использовать tomcat 8.5, потому что мы должны поддерживать сервлет api 3.1 , но мы обновились до весенней загрузки 2.2.6. и теперь проблема возникает при запуске использования встроенного кота. Если я закомментирую версию tomcat в моем pom (получая Tomcat 9), тот же код будет работать как шарм.

Это мой код EmbededTomcat:

@Value("${spring.datasource.url}")
private String jdbcUrl;

@Value("${spring.datasource.username}")
private String jdbcUsername;

@Value("${spring.datasource.password}")
private String jdbcPassword;

@Value("${spring.datasource.driver-class-name}")
private String driverClassName;

@Bean
public TomcatServletWebServerFactory tomcatFactory() {
    log.info("initializing tomcat factory... ");        
    return new TomcatServletWebServerFactory() {

        @Override
        protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
            tomcat.enableNaming();
            return super.getTomcatWebServer(tomcat);
        }

        @Override
        protected void postProcessContext(Context context) {    
            log.info("initializing tomcat factory JDNI ... ");
            // Adding connection details
            ContextResource resource = new ContextResource();
            resource.setName("jdbc/DB");
            resource.setType(DataSource.class.getName());
            resource.setProperty("driverClassName", driverClassName);
            resource.setProperty("url", jdbcUrl);
            resource.setProperty("username", jdbcUsername);
            resource.setProperty("password", jdbcPassword);

            context.getNamingResources().addResource(resource);
        }
    };
}

На моем пом. xml единственное изменение, которое я сделал:

<servlet-api.version>3.1.0</servlet-api.version> 
<!-- Forced for embeded tomcats since tomcat 9 force servlet 4.0 -->
<tomcat.version>8.5.54</tomcat.version>

И это полная ошибка стека :

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:175)

The following method did not exist:

    org.apache.tomcat.util.modeler.Registry.disableRegistry()V

The method's class, org.apache.tomcat.util.modeler.Registry, is available from the following locations:

    jar:file:/C:/Users/localAdministrator/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.54/tomcat-embed-core-8.5.54.jar!/org/apache/tomcat/util/modeler/Registry.class

It was loaded from the following location:

    file:/C:/Users/localAdministrator/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.54/tomcat-embed-core-8.5.54.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of org.apache.tomcat.util.modeler.Registry

Возможный связанный вопрос:

Я пытаюсь загрузить пример Spring, но он показывает следующую ошибку ... Что мне делать?

1 Ответ

0 голосов
/ 14 апреля 2020

Это довольно уродливое решение и, вероятно, оно не будет работать, но вы можете дать ему шанс.

  1. Создайте в своем пакете структуру приложения, как в apache lib / java / src / main / org / apache / tomcat / util / modeler /
  2. Поместите в этот пакет класс Registry из Tomcat 8.
  3. Добавьте метод-заглушку disableRegistry, что-то вроде

    public static synchronized void disableRegistry() {
        return new NoDescriptorRegistry();
    }
    
...