我们正在尝试使用 Spring Framework WebSocket support 公开 sockjs 端点.
这是 Jersey 管理路由的服务器端的配置:
@Configuration
@EnableWebSocket
public class WebSocketConfig extends WebSocketMessageBrokerConfigurationSupport {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/sockjs").withSockJS()
.setStreamBytesLimit(512 * 1024)
.setHttpMessageCacheSize(1000)
.setDisconnectDelay(30 * 1000);
}
}
问题是我们无法访问
/sockjs
,客户端代码为:List<Transport> transports = new ArrayList<>(2);
transports.add(new WebSocketTransport(new StandardWebSocketClient()));
transports.add(new RestTemplateXhrTransport());
SockJsClient sockJsClient = new SockJsClient(transports);
sockJsClient.doHandshake(new MyHandler(), "ws://localhost:8080/sockjs");
(代码来自 spring websockets tutorial)
同一包中的其他资源将在
root/api/server
下配置,即使,不是 /sockjs
也不是 /root/api/server/sockjs
可以访问。
最佳答案
我知道这是一个很古老的问题,但最近我遇到了同样的问题,我花了半天时间才找到解决方案。因为我找到了一个,所以我想分享它,至少是为了我自己的 future 。
问题是我的 WEB-INF.xml
中只有 Jersey 的 servlet 定义。 .解决方案是添加Spring的DispatcherServlet
及其到 /*
的映射路线。
所以基本上它看起来像
<servlet>
<servlet-name>spring</servlet-mapping>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
关于java - Jersey 隐藏了 Spring 框架和 SockJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965014/