【问题标题】:Java Webservice and .NET client dropping DateTime objectsJava Webservice 和 .NET 客户端删除 DateTime 对象
【发布时间】:2009-03-24 14:54:14
【问题描述】:

在 Java Web 服务和与之交谈的 .NET 客户端之间看到了一些奇怪的东西。我们来回发送一个带有DateTime 属性的对象。有点像这样(从 WSDL 生成):

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://ournamespace.com/")]
public partial class myClass {
    private System.DateTime expirationDateField;
    private string nameField;

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public System.DateTime expirationDate {
        get {
            return this.expirationDateField;
        }
        set {
            this.expirationDateField = value;
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
}

我们可以正常接收带有日期的对象,但是当我们将它们发送回 Web 服务时,expirationDate 属性显示为null。我们查看了 Java 服务器正在接收的原始 XML,并且没有 expirationDate 的标记,有点像这样:

<myClass><name>My Name</name></myClass>

(这不是确切的 XML,但足够接近)。我仔细检查了一下,expirationDate 在发送之前肯定是在 .NET 客户端上设置的。 WSDL 的 XSD 看起来并不奇怪:

<xs:element name="Expiration" type="xs:dateTime" minOccurs="0"/>

我们在其他事情上使用相同的类型,效果也很好。在 .NET 方面,我们使用wsdl.exe 工具来生成类和代码。

我们可以采取的另一个步骤是在 .NET 调用 Web 服务之前查看由 .NET 生成的 XML,但我不知道该怎么做。还有其他想法或建议吗?

【问题讨论】:

    标签: java .net web-services wsdl


    【解决方案1】:

    当模式中的值类型是可选的时,WSDL.EXE 会为该值生成一个属性,并生成一个 bool 属性来指示该值是否存在。您应该有一个 ExpirationSpecified 属性,当您想要发送到期日期时需要将其设置为 true,如果您不想发送,则需要将其设置为 false

    【讨论】:

    • 一个……你是对的。伙计,把所有这些都打出来花了太长时间。谢谢:)。
    【解决方案2】:

    除了我接受约翰的回答作为解决方案之外,我想说明完整的机制。每当将对应于“不可为空”C# 类型的“可空”Java 类型用作 Web 服务对象类型属性时,就会发生这种情况。例如,如果使用 Java 中的原始包装类型,如“Integer”、“Boolean”,则这些类型对应于不可为空的 int、bool。因此,应该设置“*Specified”属性以便发送它们。

    有关原始文档,您可以参考:
    http://msdn.microsoft.com/en-us/library/exchange/bb402199%28v=exchg.140%29.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多