【问题标题】:Tomcat + Spring Boot + 'javax.websocket.server.ServerContainer' not foundTomcat + Spring Boot + 'javax.websocket.server.ServerContainer' 未找到
【发布时间】:2019-01-08 22:32:48
【问题描述】:

我正在尝试将带有 Web 套接字的 Spring Boot (2.0.5) Web 应用程序 (war) 部署到 Tomcat 8.5.37 服务器,它以前与 Tomcat 7 一起使用。我的 Web 套接字配置抛出异常并阻止从开始申请。我是否缺少 Spring 或 Tomcat 中的某种配置?升级 Tomcat 后不再可用的东西?

我能够在本地运行(通过 eclipse 和 eclipse 的 Tomcat v8.5),但是当我尝试在我们的 qa 环境中部署到我们的 Tomcat 服务器时,我得到以下信息:

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

我能够隔离到这个 bean,如果我删除这个 bean,应用程序就会启动:

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

这是我的 Spring-BOM.xml

<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>

这是我的 pom.xml

   <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>

【问题讨论】:

  • 该错误意味着您的 servlet 容器未启用 Web 套接字。如果没有ServletServerContainerFactoryBean 有问题的 bean,网络套接字是否可以工作?
  • 网络套接字在没有ServletServerContainerFactoryBean 的情况下工作,但我需要设置更大的最大文本消息缓冲区。
  • 您正在尝试使用嵌入式 Tomcat 部署独立的可执行 jar,对吗?这就是你的 pom 似乎至少暗示的意思。
  • 我正在部署一场战争。我会更新我的问题。

标签: java spring spring-boot spring-websocket tomcat8.5


【解决方案1】:

Tomcat 9.0.20Tomcat 9.0.21SpringBoot 2.1.1SpringBoot 2.1.6 有相同的问题。 在这里找到了一些讨论:https://github.com/spring-projects/spring-boot/issues/15746

他们似乎发现了某种tomcat version 的问题。无论如何。

帮助我的是将web.xml 添加到目录WEB-INF 并粘贴以下sn-p:

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

Spring 文档:WebSocket and Spring

【讨论】:

  • 谢谢,这个解决方案也对我有用(Tomcat+Spring+GraphQL 应用程序)
  • 仅供参考:我在src/main/webapp 中创建了包含上述sn-p 的web.xml 文件。
【解决方案2】:

多年后,我们终于能够通过更新到 Apache Tomcat 8 (8.5.78) 的最新次要版本来解决这个问题。

这是我的previous answer 降级到不稳定的 Apache Tomcat 8 版本的替代选项。

【讨论】:

    【解决方案3】:

    这不是最好的答案,但我可以通过使用似乎不稳定的Apache Tomcat 8.5.4 来解决这个问题。我不确定为什么这会解决这些问题,但我最好的猜测是与 Tomcat\lib 库有关。

    我正在使用Java 8,Apache 说要使用Tomcat9,但我在使用该版本时也收到了同样的异常。

    【讨论】:

    • 我的 tomcat 服务器(在 ubuntu 18.04 上运行)遇到了同样的问题,有一个紧急更新(自动),我的 tomcat 更新为 8.5.39... 现在重新启动我的 tomcat 服务后。 ..我的应用程序无法启动并遇到与您相同的问题。我尝试了版本8.5.40,但没有运气。我会尝试8.5.4 看看它是否有效。
    【解决方案4】:

    我也遇到了这个问题,将以下 sn-p 插入我的 web.xml 文件对我不起作用:

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

    但是,我确实通过下载最新的Apache Tomcat(从9.0.309.0.34)来修复它。

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 2017-10-17
      • 1970-01-01
      • 2018-01-22
      • 2021-06-24
      • 2017-05-21
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多