嵌入式Undertown同时部署websocket和servlet,不起作用
我是使用undertow的新手,我正在开发一个独立的应用程序,将其用作嵌入式服务器。我希望我能在嵌入式系统中部署web套接字、servlet和restfull htmls服务 到目前为止,我只使用web套接字和servlet进行了测试,问题是每个单独的函数都可以正确地执行,但是如果我删除servlet页面nigun测试运行时没有错误,那么将它们部署在一起web套接字不是我从带有HTML和JavaScript的测试页面访问的 这是我的代码:嵌入式Undertown同时部署websocket和servlet,不起作用,websocket,undertow,Websocket,Undertow,我是使用undertow的新手,我正在开发一个独立的应用程序,将其用作嵌入式服务器。我希望我能在嵌入式系统中部署web套接字、servlet和restfull htmls服务 到目前为止,我只使用web套接字和servlet进行了测试,问题是每个单独的函数都可以正确地执行,但是如果我删除servlet页面nigun测试运行时没有错误,那么将它们部署在一起web套接字不是我从带有HTML和JavaScript的测试页面访问的 这是我的代码: /* * Create the ap
/*
* Create the appWebSocketDeploymentInfo and configure
*/
WebSocketDeploymentInfo appWebSocketDeploymentInfo = new WebSocketDeploymentInfo();
appWebSocketDeploymentInfo.setBuffers(new ByteBufferSlicePool(BufferAllocator.BYTE_BUFFER_ALLOCATOR, 17000, 17000 * 16));
appWebSocketDeploymentInfo.addEndpoint(WebSocketEndpoint1.class);
appWebSocketDeploymentInfo.addEndpoint(WebSocketEndpoint2.class);
/*
* Create the appDeploymentInfo and configure
*/
DeploymentInfo appDeploymentInfo = Servlets.deployment()
.setClassLoader(Server.class.getClassLoader())
.setContextPath("/myapp)
.setDeploymentName("app.war")
.setResourceManager(new FileResourceManager(new File("src/main/webapp"), 1024))
.addServlets(Servlets.servlet("HomeServlet", HomeServlet.class).addMapping("/home"))
.setResourceManager(new ClassPathResourceManager(Server.class.getClassLoader(), Server.class.getPackage()))
.addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, appWebSocketDeploymentInfo);
/*
* Create the deploymentManager
*/
deploymentManager = Servlets.defaultContainer().addDeployment(appDeploymentInfo);
/*
* Deploy the app
*/
deploymentManager.deploy();
/*
* Create the path handle
*/
pathHandler = Handlers.path(Handlers.redirect("/myapp/home")).addPrefixPath("/myapp", deploymentManager.start());
/*
* Create the server
*/
undertowServer = Undertow.builder().addHttpListener(DEFAULT_PORT, DEFAULT_IP).setHandler(pathHandler).build();
javascript日志错误为
WebSocket与“ws://localhost:8080/fermat/node channel”的连接失败:WebSocket握手时出错:意外响应代码:404经过广泛的测试和研究,我找到了正确的配置和启动服务器的方法,还将添加对其他技术的支持,例如:
- 网袋
- 放松
- 焊接
UndertowJaxrsServer server = new UndertowJaxrsServer();
Undertow.Builder serverBuilder = Undertow.builder().addHttpListener(DEFAULT_PORT, DEFAULT_IP);
ServletContainer servletContainer = Servlets.defaultContainer();
/*
* Create the App WebSocketDeploymentInfo and configure
*/
WebSocketDeploymentInfo appWebSocketDeploymentInfo = new WebSocketDeploymentInfo();
appWebSocketDeploymentInfo.setBuffers(new ByteBufferSlicePool(BufferAllocator.BYTE_BUFFER_ALLOCATOR, 17000, 17000 * 16));
appWebSocketDeploymentInfo.addEndpoint(WebSocketNodeChannelServerEndpoint.class);
appWebSocketDeploymentInfo.addEndpoint(WebSocketClientChannelServerEndpoint.class);
/*
* Create the App ResteasyDeployment and configure
*/
ResteasyDeployment deployment = new ResteasyDeployment();
deployment.setApplicationClass(JaxRsActivator.class.getName());
deployment.setInjectorFactoryClass("org.jboss.resteasy.cdi.CdiInjectorFactory");
/*
* Create the App DeploymentInfo and configure
*/
DeploymentInfo appDeploymentInfo = server.undertowDeployment(deployment, APP_NAME);
appDeploymentInfo.setClassLoader(FermatEmbeddedNodeServer.class.getClassLoader())
.setContextPath(APP_NAME)
.setDeploymentName(WAR_APP_NAME)
.addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, appWebSocketDeploymentInfo)
.addServlets(Servlets.servlet("HomeServlet", HomeServlet.class).addMapping("/home"))
.addListeners(Servlets.listener(org.jboss.weld.environment.servlet.Listener.class));
server.deploy(appDeploymentInfo);
server.start(serverBuilder);
渐变依赖关系
compile 'io.undertow:undertow-core:1.3.6.Final'
compile 'io.undertow:undertow-servlet:1.3.6.Final'
compile 'io.undertow:undertow-websockets-jsr:1.3.6.Final'
compile 'org.jboss.resteasy:resteasy-undertow:3.0.13.Final'
compile 'org.jboss.resteasy:resteasy-cdi:3.0.13.Final'
compile 'org.jboss.weld.servlet:weld-servlet:2.3.1.Final'
compile 'javax:javaee-api:7.0'
这并不是你问题的答案,但更多的是一个提示:你有没有想过使用SpringBoot来解决这个问题?它也支持Undertow,并将以自动方式处理您手动执行的操作。谢谢,但我对spring了解不多,真的不想使用它。发现了以下示例:我尝试了您的方法,但似乎无法将注入到websocket端点中。这对你有用吗?事实上,我在没有测试的端点中使用依赖注入端RESTfulWebService。是的,REST端点中的注入也对我有用。无法使其对websocket端点起作用。看起来websocket规范没有指定与CDI的集成应该如何工作,哪些上下文在起作用,等等。嘿,所以我能够实现类似的东西,您有没有解决CDI问题的方法。将bean注入websocket serverendpoints似乎并不像预期的那样工作。