使用通用的@XmlJavaTypeAdapter解压缩包装在Guava的Optional中

我正在尝试使用通用的XmlJavaTypeAdapter将一些xml解组为包含在Guava的Optional中的java对象。 但是,我无法使用generics来正常工作。

我正在使用eclipselink 2.5.1 / moxy

XML:

   Test  

Page.java:

 import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.eclipse.persistence.oxm.annotations.XmlPath; import com.google.common.base.Optional; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement() public class Page { @XmlPath("label") private Label label; @XmlJavaTypeAdapter(OptionalLabelAdapter.class) private Optional 

Label.java:

 import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlValue; @XmlAccessorType(XmlAccessType.FIELD) public class Label { @XmlValue private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } } 

MoxyTest.java:

 import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; public class MoxyTest { public static void main(String[] args) throws JAXBException { String name = "test"; JAXBContext jc = JAXBContext.newInstance(Page.class); System.out.println(jc.getClass()); Unmarshaller unmarshaller = jc.createUnmarshaller(); Page page = (Page) unmarshaller.unmarshal(new File("xml/" + name + ".xml")); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(page, System.out); } } 

这是我使用generics的适配器:

 import javax.xml.bind.annotation.adapters.XmlAdapter; import com.google.common.base.Optional; public class OptionalAdapter extends XmlAdapter<T, Optional> { @Override public Optional unmarshal(T value) throws Exception { return Optional.of(value); } @Override public T marshal(final Optional value) throws Exception { if(value.isPresent()){ return value.get(); } else { return null; } } } 

这不起作用,我得到一个包装在Optional中的ElementNSImpl。 如果我使用它确实有效:

 @XmlJavaTypeAdapter(OptionalAdapter.class) @XmlElement(name = "description", type = Label.class) private Optional 

在Page.java中。 但是,我不确定如何使用属性实现相同的function。

使用此适配器确实有效:

 import javax.xml.bind.annotation.adapters.XmlAdapter; import com.google.common.base.Optional; public class OptionalLabelAdapter extends XmlAdapter<Label, Optional 

请解释为什么我的通用适配器在没有“@XmlElement(name =”description“,type = Label.class)的情况下不起作用”并且请解释我如何为属性而不是元素实现相同的function。