Jersey 隐藏了 Spring 框架和 SockJS。

7
我们正在尝试使用Spring Framework WebSocket支持公开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教程

相同包中的其他资源会在root/api/server下进行配置,即使/sockjs/root/api/server/sockjs都无法访问。


你在Jersey中的URL映射是什么? - Paul Samsotha
web.xml 中,我们配置了以下内容: <servlet-mapping><servlet-name>Jersey Web Application</servlet-name><url-pattern>/api/*</url-pattern></servlet-mapping>我们还在 tomcat webapp 配置中设置了 /root 前缀。 与该包相同的资源定义了路径 /server - Noam
如果禁用Jersey,它能正常工作吗? - Paul Samsotha
不,这让我们明白了spring-web没有正确初始化以注册这些端点。谢谢你的帮助! - Noam
@Noam,你能分享一下帮助你的解决方案吗?我也遇到了同样的问题。 - Michal
抱歉,这是很久以前的事情了,你初始化所有内容都正确吗? - Noam
1个回答

0

我知道这是一个相当古老的问题,但最近我遇到了同样的问题,花了半天时间找到了解决方案。既然我已经找到了,我想分享一下,至少为将来的自己留个备忘。

问题是,我只在我的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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接