如何自定义使用JAXWS和APT的日期/时间的绑定?

问题描述:

即时通讯使用JAXWS 2.1.7,使用一些类通过JAXWS的易生成WSDL运行。对于日期,我用

Im using JAXWS 2.1.7, using some classes to run through JAXWS's 'apt' to generate the WSDL. For dates, I use

@XmlSchemaType(name="time")  
private Date wakeupTime;

和这将生成XS架构:时间,但是当这一切都出来,在XML中,价值是一样的东西。

and this generates a schema with xs:time, but when this all comes out in XML, the value is something like

<wakeupTime>1901-01-01T01:00:00 +10</wakeupTime>

我想只是时间部分的到来吧!我想,我想用一个自定义的转换器来说,XS:时间+ java.util.Date应打印在这种-和苏哈的方式分析,但我不能看到,我可以通过一个绑定文件到恰当程序。我不能(由于历史和放大器;其它原因)使用的XMLGregorianCalendar - 它必须是一个 java.util.Date 。我如何指定自定义为JAXB

I want JUST the time portion to come! I think I want to use a custom converter to say that xs:time + java.util.Date should be printed and parsed in such-and-sucha manner, but I cant see that I can pass a bindings file to the apt routine. I can't (for historical & other reasons) use XMLGregorianCalendar - it has to be a java.util.Date. How do I specify a custom binding for the apt tool in jaxb

OK,找到了!阅读此链接:http://weblogs.java.net/blog/2005/04/22/xmladapter-jaxb-ri-ea

并使用javax.xml.bind.annotation.adapters.XmlAdapter。即

OK, found it! Read this link: http://weblogs.java.net/blog/2005/04/22/xmladapter-jaxb-ri-ea
and use a javax.xml.bind.annotation.adapters.XmlAdapter. i.e.

public class TimeFromDateAdapter extends XmlAdapter<XMLGregorianCalendar, Date>
{
  public Date unmarshal(XMLGregorianCalendar value)
  {
    Calendar cal = value.toGregorianCalendar();
    Date d = cal.getTime();
    return d;
  }

  public XMLGregorianCalendar marshal(Date value)
  {
    Calendar cal = Calendar.getInstance();
    cal.setTime(value);
    try
    {
    XMLGregorianCalendar xmlcal =   DatatypeFactory.newInstance().newXMLGregorianCalendarTime(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0);
    return xmlcal;
    }
    catch (Exception e)
    {
      e.printStackTrace();
      return null;
    }
  }
}

和则:结果
@XmlSchemaType(NAME =时间)结果
@XmlJavaTypeAdapter(mypackage.TimeFromDateAdapter.class)结果
私人日期wakeupTime;

and then :
@XmlSchemaType(name="time")
@XmlJavaTypeAdapter(mypackage.TimeFromDateAdapter.class)
private Date wakeupTime;

和远离你去。