我有一个像下面这样的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字段。 是否需要添加任何额外的注释才能实现此目的?
请帮助我解决为什么在调用DateSort并不能正常工作的地方调用TimeStampSort Adapter的问题。
答案 0 :(得分:0)
以下是如何实现要求的示例。
最好“进一步”进行此操作,即在检索未编组的值时在服务中进行。一般来说,您要避免在简单的映射对象中使用过多的逻辑。
@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();
}
}
}