gpt4 book ai didi

java - MOXy 不导入它生成的其他模式

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:09 25 4
gpt4 key购买 nike

我按照指示here进行操作为了为我的带注释的类生成 XML 架构。我使用 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 等(如果需要,我可以提供更多代码)

最佳答案

更新 - 问题已修复

感谢您针对此问题输入以下错误。

此问题现已在 EclipseLink 2.4.2 和 2.5.0 流中得到修复。您可以从 2013 年 2 月 12 日开始使用以下的夜间下载来尝试修复:

<小时/>

我无法重现您所看到的问题。以下是我到目前为止所尝试过的。

场景 #1 - 同一命名空间中的 PersonIdentifierType

如果 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;
}

}

标识符类型

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 - 不同命名空间中的 PersonIdentifierType

如果 POJO 和 Enum 位于不同的命名空间中,则应生成两个 XML 架构。

标识符类型

我已将 @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>

关于java - MOXy 不导入它生成的其他模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14778338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com