Заставить websocket (sockjs) работать с spring4, работающим на GlassFish 3.1.2.2 - PullRequest
0 голосов
/ 07 января 2019

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

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

browser console

Тем не менее, он корректно работает под Tomcat без ошибок.

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

Спасибо.

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

dynamic.setAsyncSupported(true);

в инициализаторе веб-приложений.

@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");
    }
}

1 Ответ

0 голосов
/ 07 января 2019

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

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

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

...