生成XSD从Java使用moxy

时间:2013-08-03 06:02:11

标签: jaxb eclipselink moxy

@XmlRootElement
public class OtherClass {
    @XmlAttribute
    private String other;
}
@XmlRootElement
public class Simple extends OtherClass {
    @XmlAttribute
    private String id;
    @XmlValue
    public String contents;
}

JAXBContext context = JAXBContext.newInstance(OtherClass.class,Simple.class);
System.out.println(context);
System.out.println("org.eclipse.persistence.Version:"+Version.getVersionString());
context.generateSchema(new MySchemaOutputResolver());
System.out.println(sw);

使用woxy生成的XSD结果

org.eclipse.persistence.jaxb.JAXBContext@1292d26
org.eclipse.persistence.Version:2.5.0.v20130425-368d603
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:complexType name="otherClass">
      <xsd:sequence/>
      <xsd:attribute name="other" type="xsd:string"/>
   </xsd:complexType>
   <xsd:complexType name="simple">
      <xsd:simpleContent>
         <xsd:extension base="xsd:string">
            <xsd:attribute name="id" type="xsd:string"/> 
         </xsd:extension>
      </xsd:simpleContent>
   </xsd:complexType>
   <xsd:element name="otherClass" type="otherClass"/>
   <xsd:element name="simple" type="simple"/>
</xsd:schema>

示例/其他在xsd中没有继承,但在java中有

打扰一下,如果要解决问题?我先感谢你

1 个答案:

答案 0 :(得分:0)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

映射意味着什么

使用MOXy作为JAXB提供程序(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html),您可以使用以下代码:

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Simple.class, OtherClass.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum18029865/input.xml");
        Simple simple = (Simple) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(simple, System.out);
    }

}

将以下XML转换为Java对象:

<?xml version="1.0" encoding="UTF-8"?>
<simple id="foo" other="bar">Hello World</simple>

映射如何与XML模式相关

您映射它们的类在XML模式中没有真正的表示。由于您已使用@XmlValue注释,因此结果类型将扩展xsd:string,但您还指出它应扩展与OtherClass对应的复杂类型。


JAXB参考实现的内容

对于完全相同的映射,JAXB RI在创建JAXBContext时将通过异常。由于XML模式中不允许使用此表示形式,因此它们决定不在映射中使用它。我更喜欢我们在MOXy中选择的选项,它仍然支持映射。

Exception in thread "main" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
@XmlValue is not allowed on a class that derives another class.
    this problem is related to the following location:
        at public java.lang.String forum18029865.Simple.contents
        at forum18029865.Simple

    at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:432)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
    at forum18029865.Demo.main(Demo.java:9)