【问题标题】:JAX-WS dateTime with nanoseconds以纳秒为单位的 JAX-WS dateTime
【发布时间】:2015-08-05 20:04:08
【问题描述】:

JAX-WS 是否支持 xml 类型 dateTime 的纳秒?
W3C 允许吗?

当客户端发送时:
2015-06-11T09:02:15.863432
服务器端点看到一个未编组的 jaxb 对象,其值为
2015-06-11T09:02:15.863

我已将 dateTime 映射到 String 以查看是否可以在我的 endPoint 上接收 String 值,但我不能。 JAX-WS 中的某些东西在到达我的端点之前会剥离最后三位数字。

<xsd:element name="my_ts" type="xsd:dateTime" minOccurs="0"/>

<jaxb:globalBindings>
    <jaxb:javaType name="java.lang.String" xmlType="xsd:dateTime"/>
</jaxb:globalBindings>

W3C 说持续时间有毫秒的限制,但我没有看到 dateTime 有这样的限制。

我正在运行带有 Weblogic 12 的 java EE 6。

【问题讨论】:

  • W3C 允许:“如果需要,可以使用附加数字来提高小数秒的精度,即格式 ss.ss...支持小数点后的任意位数。”来自w3.org/TR/2001/REC-xmlschema-2-20010502/#dateTime
  • 附加信息:如果我将逻辑处理程序添加到处理程序链,则逻辑处理程序中存在纳秒。因此,在处理程序链完成后,它们会被 jax-ws servlet 剥离。当然我可以将它们存储在线程上,但这似乎是一个丑陋的解决方法。

标签: java xml jakarta-ee xsd jax-ws


【解决方案1】:

默认情况下,xsd:dateTime 应映射到 XMLGregorianCalendar,您应该能够使用 getFractionalSecond() 方法获得亚毫秒级精度。

【讨论】:

  • 对不起,我不清楚。分数在某处被剥离。传递到端点的字符串在到达端点之前已被去除小数秒。使用 XMLGregorianCalendar 不是问题
【解决方案2】:

解决方法是在我的 META-INF 服务文件夹中添加一个名为

的文件
com.sun.xml.ws.spi.db.BindingContextFactory  

然后,在该文件中,我放入以下行

com.sun.xml.ws.db.glassfish.JAXBRIContextFactory  

事实证明,weblogic 12 使用 eclipselink 作为 jax-ws 绑定提供程序。 EclipseLink unmarshaller 中存在一个关于 DateTime XML 类型的小数秒精度超过 3 位的错误。我的处理程序可以看到整个字符串的原因是我已经在我的 jaxb 提供程序中指向 glassfish 解组器。

一旦我更改了提供程序,我的适配器就能够查看并解析所有小数秒数。

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2021-06-25
    • 2021-05-16
    • 2019-08-08
    • 1970-01-01
    • 2011-11-05
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多