使用Java中的.NET Web服务
本文关键字:Web 服务 NET 中的 Java 使用 | 更新日期: 2023-09-27 18:29:17
Previously我编写了一个C#客户端来使用传统的web服务,它接受OrderInfo类的对象作为参数。OrderInfo类具有CustomerID和SpecialInstructions字段以及一个List。产品具有ProductID、Quantity和可选的PriceOverride。
创建这些并传递给C#中的WS非常简单,如下例所示:
OrderEntryService s = new OrderEntryService();
OrderInfo o = new OrderInfo();
o.CustomerId = 1;
o.Items.Add(new ProductInfo(2, 4));
o.Items.Add(new ProductInfo(1, 2, 3.95m));
checkBox1.Checked = s.CreateOrder(o);
现在在Java中,我只能访问get和set方法,这有点令人困惑,因为我只能通过调用o.getItems()来获得ArrayOfProductInfo,而不能直接将ProductInfo添加到OrderInfo中的列表中。如何用Java将产品添加到订单中?
谢谢!
假设这些是WCF服务,您应该能够获得WSDL,该WSDL可以用作JAX-WS或Apache CXF之类的东西的输入。它不会像在.NET中那样简单,但最终会成为面向对象的。
如果您的用例非常简单,那么您可以使用javax.xml.SOAP甚至JDOM来滚动自己的SOAP消息(如果您特别勇敢的话)。
有关使用javax.xml.soap.的一些详细信息,请参阅此答案
过了一段时间,我找到了一种将项目插入OrderInfo的ProductInfo列表的方法。现在8个小时后,我终于可以发布解决方案了(因为我有<10的声誉,网站不允许我更早)。
OrderInfo oi = new OrderInfo();
oi.setCustomerId(1);
oi.setSpecialInstructions("Leave on porch");
ArrayOfProductInfo ap = new ArrayOfProductInfo(); // this is web service's class's list
List<ProductInfo> lp = ap.getProductInfo(); // here we obtain a generic list reference from the above
ProductInfo pinf = new ProductInfo();
pinf.productID = 2;
pinf.quantity = 14;
pinf.currPrice = new BigDecimal("3.95");
lp.add(pinf);
pinf = new VEProductInfo();
pinf.productID = 4;
pinf.quantity = 6;
pinf.currPrice = new BigDecimal("0");
lp.add(pinf); // second product
oi.setItems(ap); // this adds product list to the order object!
WebService s = new WebService();
WebServiceSoap soapport = s.getWebServiceSoap();
soapport.createOrder(oi); // voila, passing order to the web service method.
这需要以下进口:
import java.math.BigDecimal;
import java.util.List;
当web服务在.NET端通过添加返回DataTable的方法进行更改时,出现了另一个相关问题。WSDL包含了以下部分,这让NetBeans现在很伤心:
<s:element name="GetProductsResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetProductsResult">
<s:complexType>
<s:sequence>
<s:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.w3.org/2001/XMLSchema" processContents="lax"/>
<s:any minOccurs="1" namespace="urn:schemas-microsoft-com:xml-diffgram-v1" processContents="lax"/>
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
我们意识到,特定的.NET类在Java中无法轻松使用,甚至不会使用返回该类的方法,但我们仍然需要继续使用整个web服务。NetBeans在刷新web引用时抛出以下错误:
JAXWS:wsimport实用程序无法创建Web服务客户端。原因:属性"Any"已定义使用<:jaxb:property>到解决这个冲突。
在创建java工件的过程中可能会出现问题:例如生成的类中存在名称冲突。要检测问题,另请参阅输出窗口中的错误消息。您可以在中解决问题WSDL自定义对话框。(编辑web服务属性部分)或通过使用JAXB手动编辑本地wsdl或模式文件自定义(本地wsdl和模式文件位于xml资源目录)
我们可以手动编辑出WSDL中有问题的方法,并将WSDL文件放入NetBeans项目目录中吗?还是我们应该删除web引用并重新创建,提供下载WSDL文件的路径?