【发布时间】:2012-11-12 14:17:54
【问题描述】:
我有一个用于在服务器上创建 Web 服务端点的模型。客户端使用相同的模型。但是,当向服务器添加新操作但客户端仍使用旧模型时,服务创建将失败,并出现如下异常(为清楚起见添加了换行符):
Exception in thread "main" javax.xml.ws.WebServiceException:
Method someNewMethod is exposed as WebMethod, but there is no
corresponding wsdl operation with name someNewMethod in the
wsdl:portType{http://example.com}MyService
我了解这个问题,但可以忽略它吗?我希望在使用 Web 服务时向后兼容。只要只是添加方法,这在大多数情况下都应该可以正常工作。
问题出现在getPort方法中:
Service s = Service.create(
new URL("http://example.com/foo?wsdl"),
new QName("http://example.com", "MyService"));
MyService m = s.getPort(MyService.class);
【问题讨论】:
-
您使用的是什么网络服务库?许多包都实现了 JAX-WS。例如,CXF 不会这样做。
-
@bmargulies 我们使用 Oracle 的 jaxws RI。
-
您是在使用 WSDL 中的端点地址,还是在获取端口实例后在运行时设置它?
-
@Nathan WSDL 包含端口的位置。除了 WSDL 本身之外,我没有手动设置任何地址。
-
您可以尝试在本地添加 WSDL 的副本并将 wsdlLocation 设置为该本地副本。您遇到的可能是在制作端口之前从 wsdlLocation 加载 wsdl 的构造函数。您可能应该在本地副本中放置端点的虚假地址(例如 urn:none 或其他东西),以查看它是否从实时副本中获取端点地址,但从本地副本验证操作。否则,如果您真的不需要从 wsdl 获取端点地址,则本地副本和手动设置端点 url 将起作用。