Я пытаюсь создать соединение с веб-сокетом, используя 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");
}
}