Заставить websocket (sockjs) работать с spring4, работающим в GlassFish 3.1.2.2

Я пытаюсь создать соединение с веб-сокетом, используя sockjs на клиенте и spring4 (с конфигурацией java) на бэкэнде под GlassFish 3.1.2.2, но все, что я делаю, всегда терпит неудачу со следующей проблемой:

java.lang.IllegalArgumentException: для сервлета и для всех фильтров, участвующих в обработке асинхронных запросов, должна быть включена поддержка асинхронного режима. Это делается в коде Java с использованием Servlet API или путем добавления «‹async-supported› true ‹/async-supported›» в объявления сервлетов и фильтров в web.xml. Также вы должны использовать контейнер Servlet 3.0+

консоль браузера

Однако он работает правильно под Tomcat без каких-либо ошибок.

Есть ли способ заставить эту работу работать в GlassFish 3.1.2.2? Или мне следует переписать конфигурацию Spring java обратно в стиль web.xml? Если да, может кто-нибудь показать мне пример?

Спасибо.

Я уже включил websocket в конфигурации протокола http в диспетчере GlassFish и установил

dynamic.setAsyncSupported(true);

в WebApplicationInitializer.

@Configuration
public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(final ServletContext servletContext) throws ServletException {
        final AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(IdCardReaderWebsocketApp.class);
        ctx.setServletContext(servletContext);
        final Dynamic dynamic = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        dynamic.setLoadOnStartup(2);
        dynamic.addMapping("/sockjs/*");
        dynamic.setAsyncSupported(true);
    }
}


@Configuration
@ComponentScan("com.something.websocket.idcardreader.mock")
@EnableWebMvc
@Import({ IdCardReaderWebsocketConfig.class })
public class IdCardReaderWebsocketApp extends WebMvcConfigurerAdapter {

}


@Configuration
@EnableWebSocketMessageBroker
public class IdCardReaderWebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(final StompEndpointRegistry registry) {
        registry.addEndpoint("/idCardReaderWebsocketMockEndpoint").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(final MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/mockApp");
        registry.enableSimpleBroker("/idcard");
    }
}

person Rómeó Nagy    schedule 07.01.2019    source источник


Ответы (1)


Хорошо, наконец, я исправил проблему. У меня также был файл web.xml с другим фильтром. Я добавил

<async-supported>true</async-supported>

к этому фильтру и проблема решена. Он по-прежнему не работает с протоколом ws: //, но, по крайней мере, он работает с http при попытке sockjs.

person Rómeó Nagy    schedule 07.01.2019