5
votes

Tomcat + Spring Boot + 'javax.websocket.server.ServerContainer' non trouvé

J'essaie de déployer une application Web Spring Boot (2.0.5) (war) avec des sockets Web sur un serveur Tomcat 8.5.37, cela fonctionnait auparavant avec Tomcat 7. Ma configuration de socket Web lève l'exception et empêche le l'application depuis le démarrage. Est-ce que je manque un type de configuration dans Spring ou Tomcat? Quelque chose qui n'est plus disponible depuis que j'ai mis à niveau Tomcat?

Je peux exécuter localement (via eclipse et eclipse's Tomcat v8.5), mais lorsque j'essaye de déployer sur notre serveur Tomcat sur notre environnement qa, j'obtiens ce qui suit:

   <packaging>war</packaging>
   ...
   <dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.8</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.jtds</groupId>
        <artifactId>jtds</artifactId>
    </dependency>
    <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-cypher-compiler-2.1</artifactId>
        <version>2.1.5</version>
    </dependency>
    <!-- jsoup HTML parser library @ https://jsoup.org/ -->
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.11.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.3</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.6.0</version>
    </dependency>              
    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>3.8.0</version>
        <scope>test</scope>
    </dependency>        
</dependencies>

J'ai pu isoler pour provoquer ce bean, si je supprime ce bean l'application démarre:

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

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-messaging</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Ceci est mon Spring-BOM.xml

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer{
...
...
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxTextMessageBufferSize(1024 * 1024); // 1 MB
        return container;
    }
}

Ceci est mon pom.xml

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'createWebSocketContainer' defined in class path resource [com/soft/core/app/configuration/WebSocketConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Attribute 'javax.websocket.server.ServerContainer' not found in ServletContext
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1699)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:740)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:333)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:157)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:137)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:91)
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5267)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:985)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: Attribute 'javax.websocket.server.ServerContainer' not found in ServletContext


7 commentaires

L'erreur implique que votre conteneur de servlet n'est pas activé pour les sockets Web. Les sockets Web fonctionnent-ils sans le bean problématique ServletServerContainerFactoryBean ?


serveur différent mais peut être lié ...


Les sockets Web fonctionnent sans le ServletServerContainerFactoryBean , mais je dois définir un tampon de message texte maximum plus grand.


Vous essayez de déployer un fichier exécutable autonome avec un Tomcat intégré, n'est-ce pas? C'est au moins ce que votre pom semble impliquer.


Je déploie une guerre. Je mettrai à jour ma question.


Que voulez-vous dire "Je suis capable de fonctionner localement"? Si vous effectuez une nouvelle installation locale de Tomcat 8.5 et déployez le WAR localement, cela fonctionnera-t-il?


Quand je dis exécuter localement, je veux dire via eclipse, qui utilise également Tomcat 8.5.


3 Réponses :


0
votes

Ce n'est pas la meilleure réponse, mais j'ai pu résoudre ce problème en utilisant Apache Tomcat 8.5.4 qui ne semble pas stable. Je ne sais pas pourquoi cela résout ces problèmes, mais ma meilleure estimation est quelque chose à voir avec les bibliothèques Tomcat \ lib .

J'utilise Java 8 , qu'Apache dit d'utiliser Tomcat9 , mais j'ai également reçu la même exception en utilisant cette version.


1 commentaires

a eu le même problème avec mon serveur tomcat (fonctionnant sous ubuntu 18.04), il y avait une mise à jour urgente (auto) et mon tomcat a été mis à jour vers 8.5.39 ... maintenant après le redémarrage de mon service tomcat .. . mon application ne démarre pas et a le même problème que le vôtre. J'ai essayé la version 8.5.40 sans succès. Je vais essayer 8.5.4 et voir si cela fonctionne.



5
votes

A eu le même problème pour Tomcat 9.0.20 et Tomcat 9.0.21 avec SpringBoot 2.1.1 à SpringBoot 2.1.6 . J'ai trouvé une discussion ici: https://github.com/spring-projects/spring- boot / issues / 15746

Ils semblent avoir trouvé un problème avec une sorte de version de tomcat . Quoi qu'il en soit.

Ce qui m'a aidé a été d'ajouter web.xml au catalogue WEB-INF et de coller l'extrait suivant:

<absolute-ordering>
    <name>spring_web</name>
</absolute-ordering>

Documentation de printemps: WebSocket et Spring


2 commentaires

Merci, cette solution a fonctionné pour moi aussi (application Tomcat + Spring + GraphQL)


Juste pour référence: j'ai créé le fichier web.xml contenant l'extrait ci-dessus dans src / main / webapp .



1
votes

J'ai également rencontré ce problème et l'insertion de l'extrait suivant dans mon fichier web.xml n'a pas fonctionné pour moi:

<absolute-ordering>
    <name>spring_web</name>
</absolute-ordering>

Cependant, j'ai résolu le problème en téléchargeant le plus récent Apache Tomcat (passé de 9.0.30 à 9.0.34).


0 commentaires