如何在PAX Web中注册JSR-356 Websocket?(捆绑而非战争)

如何在PAX Web中注册JSR-356 Websocket?(捆绑而非战争),websocket,osgi,karaf,jsr356,pax-web,Websocket,Osgi,Karaf,Jsr356,Pax Web,我对PAX网络有问题。我尝试将Websocket服务注册为declrarative,但无法从web访问它。我尝试了给定的websocket-jsr356-6.0.3.war,效果很好。正如我看到的,WAR文件以不同的方式处理org.osgi.service.http.HttpContext。我尝试了以下场景: 场景1-OSGi R6白板HTTP方法 创建ServletContextHelper: 包hu.blackbelt.judo.common.rest.regular; 导入org.apac

我对PAX网络有问题。我尝试将Websocket服务注册为declrarative,但无法从web访问它。我尝试了给定的websocket-jsr356-6.0.3.war,效果很好。正如我看到的,WAR文件以不同的方式处理org.osgi.service.http.HttpContext。我尝试了以下场景:

场景1-OSGi R6白板HTTP方法

创建ServletContextHelper:

包hu.blackbelt.judo.common.rest.regular;
导入org.apache.felix.scr.annotations.Component;
导入org.apache.felix.scr.annotations.Properties;
导入org.apache.felix.scr.annotations.Property;
导入org.apache.felix.scr.annotations.Service;
导入org.osgi.service.http.context.ServletContextHelper;
导入org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
@组件(立即=真)
@服务(ServletContextHelper.class)
@属性(值={
@属性(name=HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_name,value=“chat”),
@属性(name=HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH,value=“/test”)
})
公共类ChatServletContext扩展了ServletContextHelper{
}
并添加Websocket端点:

包hu.blackbelt.judo.common.rest.regular;
导入lombok.extern.slf4j.slf4j;
导入org.apache.felix.scr.annotations.Component;
导入org.apache.felix.scr.annotations.Properties;
导入org.apache.felix.scr.annotations.Property;
导入org.apache.felix.scr.annotations.Service;
导入javax.websocket.EncodeException;
导入javax.websocket.OnMessage;
导入javax.websocket.OnOpen;
导入javax.websocket.Session;
导入javax.websocket.server.PathParam;
导入javax.websocket.server.ServerEndpoint;
导入java.io.IOException;
@组件(立即=真)
@服务(Object.class)
@属性(值={
@属性(名称=HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT,
value=“=(“+HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME+”=chat)”)
})
@Slf4j
公共类聊天端点{
公共静态最终字符串ROOM=“ROOM”;
@奥诺彭
公共void onOpen(最后一个会话,@PathParam(房间)最后一个字符串房间){
LOGGER.info(“会话打开并绑定到房间:“+房间”);
session.getUserProperties().put(房间,房间);
}
@OnMessage
public void onMessage(最后一个会话,最后一个ChatMessage ChatMessage){
String room=(String)session.getUserProperties().get(room);
试一试{
对于(会话s:Session.getOpenSessions()){
如果(s.isOpen()
&&等于(s.getUserProperties().get(room))){
s、 getBasicRemote().sendObject(chatMessage);
}
}
}catch(IOException | EncodeException e){
LOGGER.warn(“onMessage失败”,e);
}
}
}
日志显示端点已被捕获。我已经调试过了,PaxWeb正在注册它

日志显示以下行:

2017-05-04 02:36:02,698 | INFO  | Thread-70        | WebSocketTracker                 | 330 - org.ops4j.pax.web.pax-web-extender-whiteboard - 6.0.3 | found websocket endpoint!!
但websocket无法通过以下URL访问:

场景2-已注册HttpContext上的Pax Web属性(使用JAX-RS即可)

正在创建HttpContext实例:(利用OSGi给定的助手抽象类):

包hu.blackbelt.judo.common.rest.regular;
导入org.apache.felix.scr.annotations.Component;
导入org.apache.felix.scr.annotations.Properties;
导入org.apache.felix.scr.annotations.Property;
导入org.apache.felix.scr.annotations.Service;
导入org.osgi.service.http.HttpContext;
导入org.osgi.service.http.context.ServletContextHelper;
@组件(立即=真)
@服务(HttpContext.class)
@属性(值={
@属性(name=“httpContext.id”,value=“chat”),
@属性(name=“httpContext.path”,value=“test”)
})
公共类ChatHttpContext扩展ServletContextHelper实现HttpContext{
}
和Websocket端点:

包hu.blackbelt.judo.common.rest.regular;
导入lombok.extern.slf4j.slf4j;
导入org.apache.felix.scr.annotations.Component;
导入org.apache.felix.scr.annotations.Properties;
导入org.apache.felix.scr.annotations.Property;
导入org.apache.felix.scr.annotations.Service;
导入org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
导入javax.websocket.EncodeException;
导入javax.websocket.OnMessage;
导入javax.websocket.OnOpen;
导入javax.websocket.Session;
导入javax.websocket.server.PathParam;
导入javax.websocket.server.ServerEndpoint;
导入java.io.IOException;
@SuppressWarnings({“checkstyle:missingctor”、“checkstyle:illegaltoken”})
@组件(立即=真)
@服务(Object.class)
@属性(值={
@属性(name=“httpContext.id”,value=“chat”)
})
@ServerEndpoint(value=“/chat/{room}”,编码器=ChatMessageEncoder.class,解码器=ChatMessageDecoder.class)
@Slf4j
公共类聊天端点{
公共静态最终字符串ROOM=“ROOM”;
@奥诺彭
公共void onOpen(最后一个会话,@PathParam(房间)最后一个字符串房间){
LOGGER.info(“会话打开并绑定到房间:“+房间”);
session.getUserProperties().put(房间,房间);
}
@OnMessage
public void onMessage(最后一个会话,最后一个ChatMessage ChatMessage){
String room=(String)session.getUserProperties().get(room);
试一试{
对于(会话s:Session.getOpenSessions()){
如果(s.isOpen()
&&等于(s.getUserProperties().get(room))){
s、 getBasicRemote().sendObject(chatMessage);
}
}
}catch(IOException | EncodeException e){
LOGGER.warn(“onMessage失败”,e);
}
}
}
但websocket无法通过以下URL访问:

我怎样才能使网络插座可用?我不想将我的包重新打包为WAB。有没有wa