当前位置: 首页 > 面试题库 >

获得“两个类具有相同的XML类型名称…”之类的JAXB异常。

蓝华皓
2023-03-14
问题内容

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

这是异常详细信息

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

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException $
Builder.check(未知源)com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(未知源)
com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl $
JAXBContextBuilder.build(未知源)的com.sun.xml.internal中的.xml.internal.bind.v2.runtime.JAXBContextImpl。
com.sun.xml.internal.bind.v2.ContextFactory.createContext(未知源)(位于sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)位于sun.reflect.NativeMethodAccessorImpl处的bind.v2.ContextFactory.createContext(未知源)。在sun.reflect.DelegatingMethodAccessorImpl.invoke(在javax.xml.bind.ContextFinder处在java.lang.reflect.Method.invoke(在未知源处)处调用(未知源)。com处javax.xml.bind.JAXBContext.newInstance(未知源)处javax.xml.bind.ContextFinder.find(未知源)处的newInstance(未知源)。
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)的方法吗?

如果我能从任何一个人那里得到解决方案,那将是很好的。…在此先感谢。

谢谢,

萨蒂亚


问题答案:

注意: 我是 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>

想要查询更多的信息

  • http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html

更新

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

MOXy的外部映射文档可用于增强或完全替换类上的元数据(请参阅:http : //blog.bdoughan.com/2011/09/mapping-
objects-to-multiple-xml-
schemas.html)。如果您只需要对其中一个City类进行更改,则无需包含其他类。

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

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

  • http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html

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

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

  • http://confluence.highsource.org/display/ANX/JAXB+User+Guide


 类似资料:
  • 我们需要创建XSD,并且需要使用项目中的现有代码(如上面的示例代码)进行封送和解封,代码没有任何注释,如“@XMLRootElement/@XMLType”,并且我们无法更改源代码。 我想知道是否有任何解决方案来解决上述问题或任何其他方法来创建xsd和封送/解封(像moxy...等)? 如果我能从任何一个那里得到解决方案就太好了...请提前谢谢。

  • 获取JAXB异常,如“两个类具有相同的XML类型名称…”, 以下是例外情况的详细信息: 异常在线程"main"com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsExcema: 1计数的IllegalAnnotationExceptions两个类有相同的XML类型名称"城市"。使用@XmlType.name和@XmlType.namespa

  • 问题内容: 我正在尝试使用RSA 7.5和Websphere 7服务器开发IBM JAX_WS Web服务。因为我是一个初学者,所以我遵循Java类优先方法,即首先创建Java类,然后生成WSDL文件。 当我尝试创建wsdl文件时,出现异常: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.I

  • 问题内容: 我有一个Animal类和一个名为AnimalExtension的Animal扩展。 这两个类之间的唯一区别是AnimalExtension还有另一个实例变量叫做animalId。Animal没有此实例变量。 我也有自己的数据类型,想要对XML进行封送处理。此数据类型称为AnimalList。在AnimalList内,有一个Animals列表作为实例变量。 animalList可以包含A

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 假设您有2个包,并且有名为-Test的公共类。 第一个包。测试 第二包测试 它们中的每一个都有实例变量-x。 在第一种情况下-int x=2; 在第二种情况下-int x=3; 我想导入FirstPackage。在第二个包内测试。测试并打印值为2的x。 我的代码: 但是输出是3。如何打印?