JAXB marshaller:未加载package-info.java

时间:2018-06-25 13:34:03

标签: java jaxb marshalling package-info

我想封送一个类型的对象

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()方法的简单调用。

现在的问题是,为什么一切都像没有软件包信息文件一样工作?

0 个答案:

没有答案