0

Previoysly 我写了一个 C# 客户端来使用一个传统的 Web 服务,它接受一个 OrderInfo 类的对象作为参数。OrderInfo 类具有 CustomerID 和 SpecialInstructions 字段以及一个列表。产品具有 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 中将产品添加到订单中?

谢谢!

4

3 回答 3

0

当通过添加返回 DataTable 的方法在 .NET 端更改 Web 服务时,刚刚出现了另一个相关问题。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 服务。刷新 Web 引用时,NetBeans 抛出以下错误:

JAXWS:wsimport 实用程序无法创建 Web 服务客户端。 原因:已定义属性“任何”。使用 <:jaxb:property> 来解决这个冲突。

在创建 Java 工件期间可能存在问题:例如生成的类中的名称冲突。要检测问题,另请参阅输出窗口中的错误消息。您可能能够在 WSDL 定制对话中解决问题。(编辑 Web 服务属性部分)或通过手动编辑本地 wsdl 或模式文件,使用 JAXB 自定义(本地 wsdl 和模式文件位于 xml-resources 目录中)

我们可以从 WSDL 中手动编辑出有问题的方法并将 WSDL 文件放入 NetBeans 项目目录吗?还是我们应该删除 Web 引用并重新创建,提供下载的 WSDL 文件的路径?

于 2013-08-30T13:31:22.477 回答
0

一段时间后,我找到了一种将项目插入 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;
于 2013-08-29T02:06:05.843 回答
0

假设这些是 WCF 服务,您应该能够获得可用作JAX-WSApache CXF之类的输入的 WSDL 。它不会像在.NET 中那样容易,但最终会是面向对象的。

如果您的用例非常简单,您可以使用 javax.xml.soap 甚至 JDOM 滚动您自己的 SOAP 消息(如果您特别勇敢的话)。

有关使用 javax.xml.soap 的一些详细信息,请参阅此答案

于 2013-08-28T15:57:20.807 回答