我想封送一个类型的对象
Map<LocalDate, String>
但是我无法执行 LocalDate 类的元帅,这是关键。在谷歌搜索中,我找到了通过package-info.java文件指定XmlAdapter的方法,但是这种方法都不起作用。 作为示例,请考虑以下片段
package stuff.project.jaxb;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
public class JaxbDateTimeAdapter {
@XmlElement(name = "map")
private Map<LocalDate, String> mapTest = new HashMap<>();
public static void main(String[] args) throws JAXBException {
JaxbDateTimeAdapter timeAdapter = new JaxbDateTimeAdapter();
timeAdapter.fillIn();
JAXBContext jaxbContext = JAXBContext.newInstance(JaxbDateTimeAdapter.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(timeAdapter, System.out);
}
private void fillIn() {
mapTest.put(LocalDate.now().plusMonths(1), "plus 1 month");
mapTest.put(LocalDate.now().plusDays(1), "plus 1 day");
}
}
并且此文件已部署在软件包中
@XmlJavaTypeAdapters(
{
@XmlJavaTypeAdapter(value = LocalTimeAdapter.class, type = LocalTime.class),
@XmlJavaTypeAdapter(value = LocalDateAdapter.class, type = LocalDate.class)
})
package stuff.project.jaxb;
import java.time.LocalDate;
import java.time.LocalTime;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
我得到的是以下输出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxbDateTimeAdapter>
<mapTest>
<entry>
<key/>
<value>plus 1 day</value>
</entry>
<entry>
<key/>
<value>plus 1 month</value>
</entry>
</mapTest>
</jaxbDateTimeAdapter>
如您所见,密钥没有在日期的 String 版本中编组。似乎未加载package-info。
PS:我喜欢的是能够加载paskcage-info中指定的所有适配器。
PPS:适配器的来源很简单,是对toString()或parse()方法的简单调用。
现在的问题是,为什么一切都像没有软件包信息文件一样工作?