删除DateTime对象的Java Web Service和.NET客户端

时间:2009-03-24 14:54:14

标签: java .net web-services wsdl

在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工具生成类和代码。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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