繁体   English   中英

从使用列表的.Net调用Java Web Service <T>

[英]Calling Java Web Service from .Net that uses List<T>

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

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

版本兼容性已设置为“ .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();
    } 

}

数据请求:

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

行信息:

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

值:

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

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

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

关于如何制作.Net的任何想法都能正确地看到这一点吗?

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

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

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

另外,如果您的RowInfo类仅具有Value对象的集合,则在DataRequest中使用Value对象的集合而不是RowInfo对象的集合并不容易

d所需要做的就是在需要List的任何地方使用数组。 您不必担心其他任何事情

我建议先做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,但先签约模式)可能是最好的方法,因为您无需重复执行绑定代码。 但是,理解它所必需的技能越来越难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM