Spring:Servlet 3.1 + SockJS =必须启用异步支持

时间:2016-07-21 17:12:31

标签: java spring spring-mvc servlets asynchronous

我已将Spring的MVC配置从XML切换到JavaConfig,并将Websocket与SockJS集成。

我的问题是,使用websocket的应用程序和配置在“localhost”(tomcat 8.0.36)上运行正常。但是当我将war包上传到我的服务器(tomcat 8.0.32)时,websocket连接失败并出现以下错误代码:

  

无法打开会话;嵌套异常是java.lang.IllegalArgumentException:必须在servlet和异步请求处理中涉及的所有过滤器上启用异步支持。这是使用Servlet API在Java代码中完成的,或者在web.xml中向servlet和过滤器声明添加“true”。此外,您必须使用具有根本原因的Servlet 3.0+容器    java.lang.IllegalArgumentException:必须在servlet和异步请求处理中涉及的所有过滤器上启用异步支持。这是使用Servlet API在Java代码中完成的,或者在web.xml中向servlet和过滤器声明添加“true”。您还必须使用Servlet 3.0+容器

我不确定这种情况的原因是什么。

请参阅下面的初始化程序:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer   {

  @Override
  protected void customizeRegistration(ServletRegistration.Dynamic registration) {
    registration.setInitParameter("dispatchOptionsRequest", "true");
    registration.setAsyncSupported(true);
  }


protected Class<?>[] getRootConfigClasses() {
    return new Class[] { MyAppConfiguration.class, MyAppSecurityConfiguration.class };
}

protected Class<?>[] getServletConfigClasses() {
    return null;
}

protected String[] getServletMappings() {
    return new String[]{"/"};
}

protected Filter[] getServletFilters() {

    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");

    return new Filter[] { characterEncodingFilter,  
                          new DelegatingFilterProxy("springSecurityFilterChain").s};
}   

}

在MyAppConfiguration.class中启用了async“@EnableAsync”:

@EnableWebMvc
@EnableScheduling 
@EnableAsync
@EnableCaching
@ComponentScan(basePackages="...")
@Configuration
public class MyAppConfiguration extends WebMvcConfigurerAdapter {

在pom.xml中我加载了javax.servlet-api

        <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

我检查了spring文档,但没有找到任何理由,为什么应用程序不能在服务器上运行,而是在localhost上: - (

在我的localhost上,我通过AJP连接器直接访问tomcat和服务器。也许必须在AJP连接器中启用某些东西才能支持异步请求? ajp连接器和apache webserver被暂时禁用,我直接用tomcat url(:8080)访问我的项目..但同样的错误: - /

1 个答案:

答案 0 :(得分:0)

我解决了我的问题; - )

将我的apache tomcat vom版本从8.0.32升级到8.5.4之后,现在都可以了。我能够与websockets通信并使用ajp ..所以,请不要使用8.0.32并选择&gt; = 8.5.4。