21

获取 JAXB 异常,例如“两个类具有相同的 XML 类型名称......”,

这是异常详细信息

线程“main”com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException 中的异常:1 个 IllegalAnnotationExceptions 计数两个类具有相同的 XML 类型名称“city”。使用@XmlType.name 和@XmlType.namespace为它们分配不同的名称。此问题与以下位置有关:在 com.model.City at public com.model.City com.model.Address.getCurrentCity() at com.model.Address 此问题与以下位置有关:在 com.common .City at public com.common.City com.model.Address.getPreviousCity() at com.model.Address

在 com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source) 在 com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source) 在 com.sun .xml.internal.bind.v2.runtime.JAXBContextImpl.(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source) at com.sun.xml.internal。 bind.v2.ContextFactory.createContext(Unknown Source) 在 com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl。在 javax.xml.bind.ContextFinder 的 java.lang.reflect.Method.invoke(Unknown Source) 处的 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 处调用(Unknown Source)。newInstance(Unknown Source) at javax.xml.bind.ContextFinder.find(Unknown Source) at javax.xml.bind.JAXBContext.newInstance(Unknown Source) at javax.xml.bind.JAXBContext.newInstance(Unknown Source) at com. PojoToXSD.main(PojoToXSD.java:17)

我举了这样的例子:

package **com.model**; ---->this package contains 'Address' class and 'City' class

public class Address {

    private String areaName;
    private City currentCity;
    private com.common.City previousCity;
}

package com.model;

public class City {

    private String cityName;
}

“com.common”包中的另一个城市类。

package **com.common**;

public class City {

    private String pinCode;
}

我们需要创建 XSD 并且需要对我们项目中的现有代码进行编组和解组(如上面的示例代码),代码没有像“@XmlRootElement/@XmlType”这样的任何注释,我们无法更改源代码。

我想知道是否有任何解决方案来解决上述问题或任何其他方法来创建 XSD 和编组/解组(如 MOXy..etc)?

如果我能从任何人那里得到解决方案,那就太好了......请提前致谢。

谢谢,

萨提亚。

4

1 回答 1

32

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

如果你可以注释类

如果您可以修改该类,您只需@XmlType向其中一个类添加注释City即可更改相应的 XML 模式类型名称。

package **com.common**;

@XmlType(name="city2")
public class City {

    private String pinCode;
}

如果你不能注释类

MOXy 提供了一个外部映射文档扩展,可用于将 JAXB 元数据应用于无法更改的类。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="**com.common**">
    <java-types>
        <java-type name="City">
            <xml-type name="city2"/>
        </java-type>
    </java-types>
</xml-bindings>

了解更多信息


更新

1)我们只需要为一个城市类编写绑定文件还是需要编写所有其他2个类(我的意思是地址和另一个城市)?

MOXy 的外部映射文档可用于增加或完全替换(参见: http ://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml-schemas.html )类上的元数据。如果您需要做的唯一更改是其中一个City类,那么您不需要包括其他类。

2)在绑定文件中,您只考虑了类名,不需要获取在 City 中定义的属性(我的意思是 pinCode)?

MOXy 像任何 JAXB 实现一样将默认映射应用于所有类。您只需要为您希望映射行为与默认值不同的位置提供元数据。

3)我们需要为此选择MOXy吗?

JAXB 没有标准的外部映射文档。我所描述的是一个 MOXy 扩展。如果您使用的是 JAXB RI,您可以查看与 Annox 的集成。

于 2013-10-02T09:54:54.630 回答