从java setter方法设置xs:datetime类型会忽略时间戳值的毫秒部分

从java setter方法设置xs:datetime类型会忽略时间戳值的毫秒部分,java,datetime,jaxb,timestamp,milliseconds,Java,Datetime,Jaxb,Timestamp,Milliseconds,我已经使用JAXB从xsd模式生成了java模式对象 我试图做的是使用java模式对象设置器方法设置xml标记的值,然后对java对象进行马歇尔处理。不过,在生成的最后一个xml上,我看到为xs:datetime类型生成的时间戳没有毫秒 我希望看到像“2013-06-28T01:20:50.000-04:00”这样的日期,我得到的只是没有毫秒的“2013-06-28T01:20:50-04:00” 设置器呼叫 对象setTransactionDateTime(getTimestamp(“2013

我已经使用JAXB从xsd模式生成了java模式对象

我试图做的是使用java模式对象设置器方法设置xml标记的值,然后对java对象进行马歇尔处理。不过,在生成的最后一个xml上,我看到为xs:datetime类型生成的时间戳没有毫秒

我希望看到像“2013-06-28T01:20:50.000-04:00”这样的日期,我得到的只是没有毫秒的“2013-06-28T01:20:50-04:00”

设置器呼叫

对象setTransactionDateTime(getTimestamp(“2013-06-28 01:20:50”)

getTimestamp方法

public Calendar getTimestamp(String dateStr)
{
    Date returnDate = null;

    if(dateStr == null)
    {
        return null;
    }       

    try
    {
        SimpleDateFormat srcFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            
        Date date = srcFormatter.parse(dateStr);        

        SimpleDateFormat destFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");    
        returnDate = destFormatter.parse(destFormatter.format(date));           
    }
    catch (ParseException e)
    {
        dbacc.logError("Error while parsing date string" + e.getMessage());
    }       

    Calendar cal = Calendar.getInstance();
    cal.setTime(returnDate);

    return cal;
}
为如下定义的日期时间类型绑定…

<jxb:javaType name="java.util.Calendar" xmlType="xsd:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime"/>

不确定代码出了什么问题。非常感谢您的帮助。

默认行为 当封送
java.util.Date
时,如果它们不是
0
,JAXB实现将封送它们

Java模型(根)

演示

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        root.setFoo(DatatypeConverter.parseDateTime("2013-08-02T11:50:00-04:00").getTime());
        root.setBar(DatatypeConverter.parseDateTime("2013-08-02T11:50:00.123-04:00").getTime());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}
输出

import java.util.Date;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlType(propOrder = { "foo", "bar" })
public class Root {

    private Date foo;
    private Date bar;

    public Date getFoo() {
        return foo;
    }

    public void setFoo(Date foo) {
        this.foo = foo;
    }

    public Date getBar() {
        return bar;
    }

    public void setBar(Date bar) {
        this.bar = bar;
    }

}

2013-08-02T11:50:00-04:00
2013-08-02T11:50:00.123-04:00
强制使用
XmlAdapter
您可以创建
XmlAdapter
来控制
java.util.Date
的编组方式:

从XML模式启动时利用
XmlAdapter
下面是我给出的一个答案的链接,该答案演示了如何在从XML模式生成模型时利用
XmlAdapter


我实际上认为,只有当毫秒不是0时,才可以通过硬编码一个非零ms值的时间戳来完成编组。然而,您的回答提供了更多关于我们如何实际强制它添加ms的细节。谢谢你的解释和例子。这肯定有帮助。