从.Net调用使用List <t> </t>的Java Web Service

时间:2011-10-07 11:13:22

标签: c# java .net web-services

我正在开发一个将由.Net客户端使用的Java Web服务。该服务公开了一个接受一个对象作为参数的方法,该对象有一个List类型的字段,Row类也有一个List类型的字段。

现在,当Java客户端使用此服务时,它正确地将类型视为List,但是当.Net客户端使用该服务时,我最终会调用期望数组类型为Value的数组(例如,Value [] [])而不是列表。

版本兼容性已设置为“.Net 3.5 / METRO 1.3”。

有没有人知道如何让它与.Net和Java客户端一样工作,因为它们接受List而不是Value [] []?

减少Web服务的版本:

服务:

    @WebService(serviceName = "Test")
    public class Test {

    @WebMethod(operationName = "DataRequest")
    public DataResponse DataRequest(DataRequest req) {
        return new DataResponse();
    } 

}

DataRequest:

public class DataRequest {
    public DataType datType;
    public String source;
    public List<RowInfo> rows;
    public String loginId;
}

RowInfo:

public class RowInfo {
   public List<Value> valueList;
}

值:

public class Value {    
    public String name;
    public String value;
}

在我的.Net客户端上,当我尝试构建请求对象时,它将FeeDataRequest的rows字段视为Value [] []而不是List。

已配置.Net中的服务引用,以便集合类型为System.Collections.Generic.List。

关于如何使.Net正确地看到这一点的想法?

4 个答案:

答案 0 :(得分:2)

使用jsonxml在您的服务之间发送数据。

答案 1 :(得分:1)

您可以发布Web服务的WSDL吗?

默认情况下,生成WSDL时,List对象将转换为数组。 .NET试图构建对象类型来自WSDL。

此外,如果您的RowInfo类只有一个Value对象集合,那么在DataRequest中使用Value对象的集合并不容易,而不是RowInfo对象的集合

答案 2 :(得分:0)

你需要的只是使用期望List的数组。你不必担心别的什么

答案 3 :(得分:0)

我建议先做WSDL,然后从那里创建客户端和接口。然后映射到您需要处理服务实现的对象。

您的架构将类似于

<complexType name="DataRequest">
    <all>
        <element name="datType" type="DataType" />
        <element name="source" type="string" />
        <element name="rows">
            <complexType>
                <sequence>
                    <element name="row" type="RowInfo" minOccurs="0" maxOccurs="unbounded" />
                </sequence>
            </complexType>
        </element>
        <element name="loginId" type="string" />
    </all>
</complexType>

使用与行相同的模式跟随RowInfo。这是minOccurs =“0”和maxOccurs =“unbounded”。这将使客户端生成器创建一个列表。

<complexType name="RowInfo">
   <sequence>
       <element name="valueList" type="Value" minOccurs="0" maxOccurs="unbounded" />
   </sequence>
<complexType>

你拥有的最后一种类型是价值。

<complexType name="Value">
    <all>
         <element name="name" type="string" />
         <element name="value" type="string" />
    </all>
</complexType>

最后你需要一个包含元素。

<element name="dataRequest" type="DataRequest" />

当然上面只是解释,你仍然需要放入名称空格等。

新Web服务开发人员(包括我自己)的一个问题是我们认为只编写Web服务并让代码生成完成工作是一个好主意。不幸的是,在使用它之后,我认为如果你有一个知道如何编写WSDL和XML模式的人,你就会有更好的互操作性并获得Web服务的价值。

特别是XML架构部分。我是学校的混合方法(代码第一个WSDL,但合同第一个模式)可能是最好的方法,因为你不需要处理重复自己做绑定代码。但是,理解它所需的技能变得更难。