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

时间:2013-10-02 08:22:57

标签: java xml jaxb

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

以下是例外情况

  

线程“main”中的异常   com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1   IllegalAnnotationExceptions的计数两个类具有相同的XML   输入名称“city”。使用@ XmlType.name和@ XmlType.namespace 进行分配   不同的名字给他们。这个问题与以下内容有关   location:at com.model.City at public com.model.City   Com.model.Address.getCurrentCity()在com.model.Address这个   问题与以下位置有关:在com.common.City         在公共com.common.City com.model.Address.getPreviousCity()at   com.model.Address

     

在   com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException $ Builder.check(未知   来源)at   com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(未知   来源)at   com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl。(未知   来源)at   com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl $ JAXBContextBuilder.build(未知   来源)at   com.sun.xml.internal.bind.v2.ContextFactory.createContext(未知   来源)at   com.sun.xml.internal.bind.v2.ContextFactory.createContext(未知   来源)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native   方法)at sun.reflect.NativeMethodAccessorImpl.invoke(未知   来源)at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知   来自)java.lang.reflect.Method.invoke(未知来源)at   javax.xml.bind.ContextFinder.newInstance(未知来源)at   javax.xml.bind.ContextFinder.find(未知来源)at   javax.xml.bind.JAXBContext.newInstance(未知来源)at   javax.xml.bind.JAXBContext.newInstance(未知来源)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)?

如果我能从任何一个人那里得到解决方案,那将是很棒的......请提前感谢。

谢谢,

萨蒂亚。

1 个答案:

答案 0 :(得分:24)

注意:我是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)我们只需要为一个City类或必需的内容编写绑定文件   写下所有其他2个班级(我的意思是地址和另一个城市)?

MOXy的外部映射文档可用于扩充或完全替换(请参阅:http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml-schemas.html)类的元数据。如果您需要进行的唯一更改是其中一个City课程,那么您就不需要包含其他课程。

  

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

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

  

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

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