使用内置 Java JAX-WS Web 服务器发布多个端点
Posted
技术标签:
【中文标题】使用内置 Java JAX-WS Web 服务器发布多个端点【英文标题】:Publishing multiple Endpoints with built-in Java JAX-WS web server 【发布时间】:2014-09-09 11:29:40 【问题描述】:所以我有 2 个实现,Impl1 和 Impl2,一个 Web 服务接口类。我想在相同的域和端口下发布,但使用不同的 URL:
http://some.domain.asd/ws1 和 http://some.domain.asd/ws2
显然,我应该能够创建一个配置,其中我有 2 个端点,每个实现一个,绑定到单个 Web 服务器实例。
请注意,我不是在部署而是使用 Java 7 内部发布机制。 我注意到,而不是调用
Endpoint.publish(URL, new Implementor());
直接发布web服务,我可以调用
Endpoint ep = Endpoint.create(new Implementor());
ep.publish(serverContext);
在特定的 serverContext 上发布实施程序。这样的 serverContext 到底是什么,我该如何使用它?我注意到publish
方法实例化了一个javax.xml.ws.spi.Provider
类并将其用于发布目的。但这显然不是我想要的。理想情况下,我想要一个类似于这样的解决方案:
Object serverContext = new Server(URL);
Endpoint impl1 = Endpoint.create(new Impl1());
Endpoint impl2 = Endpoint.create(new Impl2());
impl1.publish(serverContext);
impl2.publish(serverContext);
这甚至可以使用内置发布系统来完成,也许使用EndpointReferences
对象?或者我是否需要使用 Web 服务容器来单独部署我的 Endpoints?
【问题讨论】:
【参考方案1】:使用此代码可以实现发布在同一端口上运行的多个端点:
@SpringBootApplication
public class Application
public static void main(String[] args)
SpringApplication.run(Application.class, args);
Endpoint.publish("http://localhost:8888/ws/send", new SendServiceImpl());
Endpoint.publish("http://localhost:8888/ws/send23", new SendServiceImpl());
在 Eclipse 中本地运行它可以工作,但是当你将它部署到另一台服务器时它就坏了。 要解决此问题,您可以使用 http://0.0.0.0:8888 而不是 localhost 或服务器的正确内部 IP 地址。
您发现它正在运行: 窗口:ipconfig Unix:ifconfig
看起来像这样:192.168.100.55。
【讨论】:
如果您认为您链接的问题也可以回答这个问题,请将其标记为重复,不要将其链接为答案。 由于我的代表率低,我无法将其标记为重复。 这不是重复的,而且答案不会令人满意。但我编辑了答案,因为我找到了一个行之有效的解决方案。 即使在 Eclipse 中也不适合我。例外是“java.net.BindException:地址已在使用中” @Jian Chen 那么你应该将端口从 8888 更改为你想要的任何端口。【参考方案2】:我今天偶然发现了这个问题;将两个不同的端点发布到同一个主机+端口时,我不断收到“java.net.BindException:地址已在使用”。解决方案是自己实例化HttpServer
并将每个端点“绑定”到此服务器:
package mypackage;
import com.sun.net.httpserver.HttpServer;
import javax.xml.ws.Endpoint;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
public static void main(String[] args) throws IOException
final HttpServer httpServer = HttpServer.create(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 8080), 16);
final Endpoint fooEndpoint = Endpoint.create(new FooImpl());
fooEndpoint.publish(httpServer.createContext("/Foo"));
final Endpoint barEndpoint = Endpoint.create(new BarImpl());
barEndpoint.publish(httpServer.createContext("/Bar"));
httpServer.start();
【讨论】:
我收到错误“类 sun.net.httpserver.HttpContextImpl 不是受支持的上下文。”在运行时发布功能。以上是关于使用内置 Java JAX-WS Web 服务器发布多个端点的主要内容,如果未能解决你的问题,请参考以下文章
如何避免需要在 CXF 或 JAX-WS 生成的 Web 服务客户端中指定 WSDL 位置?
如何避免在CXF或JAX-WS生成的Web服务客户端中指定WSDL位置?