使用通用的@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。
- Flink中的java.lang.NoSuchMethodError
- 在JFrame中用JPanel替换JPanel
- Spring RestTemplate处理状态为NO_CONTENT的响应时的行为
- 本地JVM之间的通信
- 什么是Scala相当于Java的静态块?
- 如何查看Java 1.4中另一个字符串中是否存在子字符串?
- Sonar Scanner引擎未启动
- OpenShift上的OpenJDK:“NoSuchAlgorithmException:EC AlgorithmParameters not available”
- 通过OAuth支持Facebook / Twitter身份validation的CAS服务器