【问题标题】:java and .NET webservice interoperability: outputing a decimal with only 2 digits in the SOAPjava 和 .NET Web 服务互操作性:在 SOAP 中输出只有 2 位的小数
【发布时间】:2012-05-14 10:41:59
【问题描述】:

我正在从 .NET 客户端向 Java Web 服务进行 Web 服务调用。 Web 服务请求消息中的字段之一是小数。

使用代理请求对象设置:

decimal value = 3.0
request.DecimalValue = value ;
javaService.Process(request);

当消息被序列化为soap时,DecimalValue设置为3.000000。然而,java web 服务出错了,因为它只需要小数点后 3 位数字。关于如何解决这个问题的任何想法?我无法控制 java web 服务。

补充:

java webservice 的架构将 DecimalValue 定义为

<xs:simpleType name="DecimalValue">
 <xs:restriction base="xs:decimal">
  <xs:totalDigits value="9" />
  <xs:fractionDigits value="3" />
  <xs:pattern value="\d{1,5}\.\d{3}" />
 </xs:restriction>

通过添加对端点的引用来生成 Web 服务代理。

【问题讨论】:

  • 如果您拥有所有标准 SOAP 绑定并使用来自http://www.w3.org/2001/XMLSchemadecimal,则十进制值应编组为“3”。您将需要有关架构、错误、通过网络传输的实际数据的更多信息。还有您是如何创建 .net 客户端的(您是在 VS 中从 WSDL 创建的吗?)
  • @DMoses,请看我对问题的补充。,
  • 我不知道为什么它会编组为3.000000。它应该编组为3,因为它忽略了此处文档中的所有这些限制:msdn.microsoft.com/en-us/library/ms733112.aspx 您需要自定义请求对象。

标签: java .net serialization soap


【解决方案1】:

鉴于此示例是使用您提供的简单 xsd 创建的:

    [System.Runtime.Serialization.DataMemberAttribute(Order=0)]
    public decimal DecimalValue;

我会将其更改为以下内容:

    [System.Runtime.Serialization.DataMemberAttribute(Order=0, Name="DecimalValue")]
    private string DecimalValueFormatted;
    private decimal decimal_value_int;

    public decimal DecimalValue {
        get { return decimal_value_int; }
        set 
        { 
            decimal_value_int = value; 
            DecimalValueFormatted = String.format("{0:N2}", value);
        }
    }

注意:这有点像 hack,如果你必须为很多类型做这件事,你会想创建你自己的格式属性,你可以把它放在数据成员上,并为选中的小数添加自定义类型绑定你的属性。属性方法我还没有真正做过,所以这可能比听起来更难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多