Java 如何使用JAXB管理XMLGregorianCalendar?
我尝试编写XMLGregorianCalender的XML版本,使用GN JAXB创建XMLWeb服务请求。但它不会打印出来Java 如何使用JAXB管理XMLGregorianCalendar?,java,xml,jaxb,Java,Xml,Jaxb,我尝试编写XMLGregorianCalender的XML版本,使用GN JAXB创建XMLWeb服务请求。但它不会打印出来 private static XMLGregorianCalendar getXmlDate() throws DatatypeConfigurationException { return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyy
private static XMLGregorianCalendar getXmlDate() throws DatatypeConfigurationException {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
}
同班别的
try {
applicationHeader.setApplicationDate(getXmlDate());
} catch (DatatypeConfigurationException e1) {
e1.printStackTrace();
}
因此它调用ApplicationHeader类中生成的代码
@XmlElement(name = "ApplicationDate", required = true)
protected XMLGregorianCalendar applicationDate;
public XMLGregorianCalendar getApplicationDate() {
return applicationDate;
}
public void setApplicationDate(XMLGregorianCalendar value) {
this.applicationDate = value;
}
...
所以我希望得到像这样的东西
<ApplicationDate>2009-03-13</ApplicationDate>
2009-03-13
但是我有
<ApplicationDate></ApplicationDate>
我做错了什么 显然,JAXB无法处理XMLGregorianCalender类型。因此,我通过使用JAXBXmlAdapter解决了这个问题,它本质上允许我们映射任何类型的类。在哪里 BoundType-类型JAXB不知道如何处理。在本例中,是一个XMLGregorianCalendar ValueType——JAXB实际上知道如何处理这种类型。在本例中是一个类型字符串 因此,在生成XML请求时,可以扩展XMLAdapter,将BoundType转换为ValueType。因此,我们本质上是在ValueType中创建类型的内存表示 代码如下所示
public class DateAdapter extends XmlAdapter<String, XMLGregorianCalendar> {
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// Unmarshal by converting the value type to a bound type.
@Override
public XMLGregorianCalendar unmarshal(String v) throws Exception {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(v);
}
// Marshal by converting the bound type to a value type.
@Override
public String marshal(XMLGregorianCalendar v) throws Exception {
synchronized (dateFormat) {
//return dateFormat.format(v);
return specialFormatForXmlGregorianCalander(v);
}
}
// Because you cannot format an XMLGregorianCalender typyou need to generate a GregorianCalender from it first
private String specialFormatForXmlGregorianCalander(XMLGregorianCalendar calander){
// Convert from XMLGregorianCalander to GregorianCalander
GregorianCalendar gCalender = calander.toGregorianCalendar();
// Get the date
java.util.Date date = gCalender.getTime();
//define the type of calendar to be GegorianCalander
dateFormat.setCalendar(gCalender);
// Return the string version
return dateFormat.format(date);
}
}
在重新运行我的代码时,我得到了
<app1:ApplicationDate>2017-08-15</app1:ApplicationDate>
2017-08-15
试试这个JAXB.marshal(obj,System.out);它为我打印了XMLGregorianCalendar
<app1:ApplicationDate>2017-08-15</app1:ApplicationDate>