我有一个XML像下面,我需要使用此XML来填充对象下面我需要的时间是在日期的所需的格式和时间戳转换。我这样做,用下面提到的代码。
<customer>
<name>john</name>
<date>10/10/18</date>
<customer>
@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
@XmlElement(name="name")
private String name;
@XmlJavaTypeAdapter (DateSort.class)
@XmlElement(name="date")
private String date;
@XmlJavaTypeAdapter (TimeStampSort.class)
@XmlElement(name="date")
private long dateTimestamp;
setters()/getters()
}
public class DateSort extends XmlAdapter<String, String> implements DateFormats {
@Override
public String marshal(String date) throws Exception {
return dateFormat.format(date);
}
@Override
public String unmarshal(String date) throws ParseException {
Date pubDate = sourceDateFormat.parse(date);
return outputDateFormat.format(pubDate);
}
}
public class TimeStampSort extends XmlAdapter<String, Long> implements DateFormats {
@Override
public Long unmarshal(String date) throws Exception {
Date newDate = sourceDateFormat.parse(date);
return Long.parseLong(monthFormat.format(newDate));
}
@Override
public String marshal(Long date) throws Exception {
return new Date(date).toString ();
}
}
我现在面临这里的问题是XmlJavaTypeAdapter被称为为“约会”而不是dateTimestamp属性。我不知道为什么这种行为存在。
我试着这样做配置
@XmlJavaTypeAdapter (value=DateSort.class, type=Long.class)
@XmlElement(name="PUBDATE", type=Long.class)
@XmlJavaTypeAdapter (value=DateSort.class, type=long.class)
@XmlElement(name="PUBDATE", type=long.class)
和转换类型
private Long timeStamp;
这一切都不奏效。
这里的一个问题是,我需要相同的元素被映射到多个转换POJO领域。是否有需要被添加到实现这一目标的任何额外的注解?
请帮我解决这个问题,如为什么TimeStampSort适配器不会被调用,其中作为DateSort被调用,并正常工作。
以下是如何可以达到你所要求的一个例子。
检索解组的值时,它会更好,虽然要做到这一点“进一步上涨”,即在服务。一般来说,你尽量避免简单的映射对象有太多的逻辑。
@XmlRootElement
class Customer {
private String name;
private String date;
private long dateTimestamp;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date; // You can do additional transformations here
try {
this.dateTimestamp = new SimpleDateFormat("MM/dd/yy").parse(date).getTime();
} catch (ParseException e) {
// Handle this appropriately ;-)
}
}
public long getDateTimestamp() {
return dateTimestamp;
}
@Override
public String toString() {
return new StringJoiner(", ", Customer.class.getSimpleName() + "[", "]")
.add("name='" + name + "'")
.add("date='" + date + "'")
.add("dateTimestamp=" + dateTimestamp)
.toString();
}
}
public class XmlUnmarshaller {
private static final String XML_STRING =
"<customer>\n" +
" <name>john</name>\n" +
" <date>10/10/18</date>\n" +
"</customer>";
public static void main(String[] args) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new ByteArrayInputStream(XML_STRING.getBytes(StandardCharsets.UTF_8)));
System.out.println(customer);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}