我按照here指令为我的带注释的类生成XML Schema。我使用MOXy作为JAXB的底层实现,因为我需要它的某些功能,如@XmlPath
以及它如何处理XmlAdapter
的基本类型。
上面链接中的代码将模式生成为两个模式文件,即一个包含简单和复杂类型的规则,另一个仅包含枚举类型的模式。理想情况下,我希望它们位于单个模式文件中,但这不是现在的主要问题。
当我使用JAXB的Sun实现时,它会生成模式并导入另一个模式。但是,当我切换到使用MOXy实现时,它不会导入其他模式,请参阅下面的示例:
<xsd:schema xmlns:ns0="http://my/schema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://my/schema" elementFormDefault="qualified">
<!-- this bit is missing when MOXy is used -->
<xsd:import schemaLocation="schema2.xsd"/>
...
</xsd:schema>
有谁知道如何解决这个问题?
以下是我使用的代码:
JAXBContext context = JAXBContext.newInstance(Person.class, IdentifierType.class);
SchemaOutputResolver sor = new MySchemaOutputResolver();
context.generateSchema(sor);
Person
是标准的POJO,IdentifierType
是枚举。它们都使用JAXB注释进行注释,例如@XmlRootElement
,@XmlEnum
等。(如果需要,我可以提供更多代码)
答案 0 :(得分:1)
更新 - 问题已修复
感谢您输入此问题的后续错误。
现在已经在EclipseLink 2.4.2和2.5.0流中修复了这个问题。您可以从2013年2月12日开始每晚下载,从下面的想法中尝试修复:
我无法重现您所看到的问题。以下是我到目前为止所尝试的内容。
情景#1 - 同一空间中的Person
和IdentifierType
如果POJO和Enum位于同一名称空间中,则只会生成一个XML模式。
人(POJO)
package forum14778338;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Person {
private IdentifierType identifierType;
public IdentifierType getIdentifierType() {
return identifierType;
}
public void setIdentifierType(IdentifierType identifierType) {
this.identifierType = identifierType;
}
}
<强> IdentifierType 强>
package forum14778338;
public enum IdentifierType {
FOO,
BAR
}
的 jaxb.properties 强>
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<强>演示强>
package forum14778338;
import java.io.IOException;
import javax.xml.bind.*;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);
jc.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(String namespaceURI, String suggestedFileName)
throws IOException {
StreamResult result = new StreamResult(System.out);
result.setSystemId(suggestedFileName);
return result;
}
});
}
}
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="person">
<xsd:sequence>
<xsd:element name="identifierType" type="identifierType" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="person" type="person"/>
<xsd:simpleType name="identifierType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="FOO"/>
<xsd:enumeration value="BAR"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
情景#2 - 不同命名空间中的Person
和IdentifierType
如果POJO和Enum位于不同的名称空间中,则应生成两个XML模式。
<强> IdentifierType 强>
我已将@XmlType
注释添加到IdentifierType
枚举中,以将其放在不同的命名空间中。
package forum14778338;
import javax.xml.bind.annotation.*;
@XmlEnum
@XmlType(namespace="foo")
public enum IdentifierType {
FOO,
BAR
}
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:ns0="foo" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import schemaLocation="schema2.xsd" namespace="foo"/>
<xsd:complexType name="person">
<xsd:sequence>
<xsd:element name="identifierType" type="ns0:identifierType" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="person" type="person"/>
</xsd:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:ns0="foo" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="foo">
<xsd:simpleType name="identifierType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="FOO"/>
<xsd:enumeration value="BAR"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>