- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这个服务定义:
[DataContract]
public class Test
{
[DataMember(IsRequired = true)]
public TestArray[] array;
}
[DataContract]
public class TestArray
{
public DateTime? field1;
public string field2;
}
哪些 WCF 元数据提供程序 ( http://localhost/Test?wsdl) 生成为:
<xs:complexType name="ArrayOfTestArray">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="array" nillable="true" type="tns:TestArray"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="OpenBalanceInvoice">
<xs:sequence>
<xs:element name="field1" nillable="true" type="xs:dateTime"/>
<xs:element name="field2" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
问题是(即使它在 svcutil.exe 神奇地从中生成客户端时有效)Metadataprovider 实际上创建了一个新对象(ArrayOfTestArray),它在生成它的代码中不存在
问题:当我尝试从这个 WSDL 生成一个 JavaClient 时,它 - 当然 - 没有认识到这个“ArrayOf”对象根本不是一个“真正的”对象并且 Java 类看起来像:
class Test
{
public ArrayOfTestArray array;
}
class ArrayOfTestArray
{
public TestArray[] array;
}
public class TestArray
{
public DateTime? field1;
public string field2;
}
所以,我当然不想要这个额外的类(class)......有什么建议吗?
谢谢!
最佳答案
我的建议是修改 XSD 文件本身,因为在 .NET 方面您可能无能为力。
以下 XSLT 应该适用于您的情况(前提是元素和复杂类型位于同一架构文件中):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:template match="xsd:complexType[@name]">
<!-- This templace filters out any complexTypes with a name starting with 'ArrayOf' -->
<xsl:if test="not(starts-with(@name, 'ArrayOf'))">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="xsd:element[@type]">
<!-- This templace inlines any elements referencing a type starting with 'ArrayOf' -->
<xsl:variable name="typeName">
<xsl:choose>
<xsl:when test="contains(@type, ':')">
<xsl:value-of select="substring-after(@type, ':')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@type" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose><!-- Should we inline? -->
<xsl:when test="starts-with($typeName, 'ArrayOf')">
<!-- Yep, inline it, but wrap in a sequence! -->
<xsl:apply-templates select="xsd:annotation" />
<xsd:element>
<!-- copy over attributes such as name, minOccurs, maxOccurs, nillable -->
<xsl:copy-of select="@*[local-name(.) != 'type']" />
<xsl:comment>
Inlined from <xsl:value-of select="@type" />):
</xsl:comment>
<xsd:complexType>
<xsl:apply-templates select="//xsd:complexType[@name=$typeName]/*" />
</xsd:complexType>
<xsl:comment>End of inlined element</xsl:comment>
</xsd:element>
<xsl:apply-templates
select="xsd:attribute | xsd:attributeGroup | xsd:attributeGroup" />
</xsl:when>
<xsl:otherwise>
<!-- Nah, just copy -->
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- General copy rule -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
给定此输入 XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/ExtensionFlattener" xmlns:tns="http://www.example.org/ExtensionFlattener"
elementFormDefault="qualified">
<xs:element name="SomeElement">
<xs:complexType>
<xs:sequence>
<xs:element name="First" type="xs:string" />
<xs:element name="Second" minOccurs="0" type="tns:ArrayOfTestArray" nillable="true"/>
<xs:element name="Third" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfTestArray">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="array"
nillable="true" type="tns:TestArray" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="TestArray">
<xs:sequence>
<xs:element name="field1" nillable="true" type="xs:dateTime" />
<xs:element name="field2" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
它将变成:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.example.org/ExtensionFlattener" targetNamespace="http://www.example.org/ExtensionFlattener"
elementFormDefault="qualified">
<xs:element name="SomeElement">
<xs:complexType>
<xs:sequence>
<xs:element name="First" type="xs:string" />
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="Second" minOccurs="0" nillable="true">
<!-- Inlined from tns:ArrayOfTestArray): -->
<xsd:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="array"
nillable="true" type="tns:TestArray" />
</xs:sequence>
</xsd:complexType>
<!--End of inlined element -->
</xsd:element>
<xs:element name="Third" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="TestArray">
<xs:sequence>
<xs:element name="field1" nillable="true" type="xs:dateTime" />
<xs:element name="field2" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
这会生成更好的 Java 类(尽管它仍然会为您提供额外的本地类型):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"first",
"second",
"third"
})
@XmlRootElement(name = "SomeElement")
public class SomeElement {
@XmlElement(name = "First", required = true)
protected String first;
@XmlElementRef(name = "Second", namespace = "http://www.example.org/ExtensionFlattener", type = JAXBElement.class)
protected JAXBElement<SomeElement.Second> second;
@XmlElement(name = "Third", required = true)
protected String third;
// Plus getters and setters
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"array"
})
public static class Second {
@XmlElement(nillable = true)
protected List<TestArray> array;
// plus getter
}
}
(plus the other class)
我希望这适用于您的问题(双关语!)
关于java - WCF自动生成的WSDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2222697/
为什么 WSDL 引入 wsdl:message?和消息部分? 与在操作参数(输入、输出、故障)中直接使用 XSD 相比,他们可以带来什么优势? 它们(带有 wsdl 消息部分的 wsdl 消息)如何
这个问题看起来很简单,但我找不到合适的地方在 WSDL 文档中设置其定义的版本。 目标是能够很容易地看到它何时过时,以及我将来何时更新它。 我要把它设为 1.0。如果将来我向它添加新操作,我将其设置为
在 WSDL 文件中,函数可以返回类型或元素。到目前为止,我仅使用自定义类型作为结果。但是,我想知道什么时候Element应该比Type更合适?它们有什么区别? 有什么区别吗 和
我在 web sphere 服务器上部署了一个 jax-ws web 服务,当我尝试使用 url 在浏览器中访问 wsdl 时 "Http://localhost:7001/HelloWorldSer
我在使用 SVCUtil 为 WCF 生成代理时遇到错误。错误是 Attempting to download metadata from 'net.pipe://localhost/WebServi
我正在遵循 WSDL-first(由我们的客户提供)方法来开发 WCF 服务,但是从我的 wcf 服务生成的 WSDL 与我们的客户提供给我的 WSDL 略有不同,并且由于这种不匹配,客户在调用我的服
我有嵌套的 WSDL,我想将其扁平化。 wsdl 导入 xsd 文件,这些文件又包含其他文件等。我喜欢把整个东西压平成一个文件,以便将它提供给一个无法执行导入/包含的工具。有没有我可以使用的简单工具(
我正在尝试使用一些统计信息进行 WSDL 解析(使用 c#.net)。我的统计数据取决于 WSDL 中的文档标签。我想知道可以包含文档标签的 wsdl 标签列表来检查它们。 我试图阅读 WS-I 基本
我有一个 WSDL 文件。我想将 wsdl 文件转换为 Web 服务类文件。 是否可以?如果是,请向我详细解释。 最佳答案 在解决方案资源管理器中右键单击 您的项目并转到“添加服务 引用...” 按窗
我正在使用 Axis 为示例 WebService 建模。我现在正在做的是试图了解自动化 wsdl 和代码生成的局限性。 现在对于一些服务器端代码: 这是示例 Web 服务的框架: public cl
我有一个 Silverlight 应用程序,它通过 WCF 服务与服务器端的 ADO.Net 数据实体通信。实际上,我正在使用多个 WCF 服务与三个不同的数据 ADO.Net 数据实体进行通信。我最
是否有使用服务端点地址获取服务 WSDL 的通用方法。我知道这可以通过将 ?wsdl 附加到 Axis2 服务来完成。但是这个属性是否也适用于其他 Web 服务容器? 最佳答案 ?wsdl 适用于所有
例如使用 png归档其 mime-type是“图像/png”;那么 wsdl 的 MIME 类型是什么?文件 ? 最佳答案 text/xml - WSDL 是基于 XML 格式的服务描述。 您可以在“
我的服务是从一个 wsdl 文件中选取的。但是发布的服务 wso2 是 chenged。如果我希望 wso2 像我的 wsdl 文件一样发布。如何设置?例如,我的 wsdl 文件是:
我需要在给定 XSD 文件的情况下生成 WSDL 文件。我该怎么做呢?我可以在VS2005中这样做吗?最简单的方法是什么? 最佳答案 你不能 - XSD 描述数据方面,例如Web 服务的功能 - WS
有什么方法可以从 wsdl 生成 xsd 吗?任何链接或工具也可以。最简单的方法是什么? 最佳答案 您可以使用SoapUI:http://www.soapui.org/这是一个通常很方便的程序。创建一
我启动我的 azure 应用程序,浏览到 svc 文件 http://127.0.0.1:82/transaction.svc ,我得到了通常的结果: You have created a servi
我使用动态端点 wsdl(通过 http 的 wsdl)来生成客户端。这工作得很好。 是否可以从动态wsdl的http链接生成静态wsdl? 问题是动态 wsdl 只能从一台机器访问。 我想在另一台电
我想知道是否可以将请求从一个 wsdl 发送到另一个 wsdl。如果是,那我该怎么做? 流程将是: 我想使用 switchyard 公开一个 wsdl,比如 wsdl-1,它可能有 100 个参数,带
我按照定义的步骤使用 Spring Boot 创建了一个网络服务 here当我尝试下载 wsdl 时,我不得不在 url 中使用 .wsdl 。但是,当我使用 ?wsdl 时,不会下载 wsdl。当我
我是一名优秀的程序员,十分优秀!