当前位置: 首页 > 知识库问答 >
问题:

JAXB生成的类相互冲突

何志业
2023-03-14

我使用JAXBXJC工具从多个XML文件生成了多个类。

这些XML文件有共同的标记名,这涉及到,当我生成java类时,我有多个同名的类。我将它们放入不同的包中,并因此重命名了它们。

但我仍然有一个错误:

元素名{}文档有多个映射。这个问题与以下位置有关:在公共javax.xml.bind.JAXBElementcom.xxx.generatedByJaxb.bal.ObjectFactory.create文档(com.xxx.generatedByJaxb.bal.DocumentTypeBal)在com.xxx.generatedByJaxb.bal.ObjectFactory此问题与以下位置有关:在公共javax.xml.bind.JAXBElementcom.xxx.generatedByJaxb.addr.ObjectFactory.create文档(com.xxx.generatedByJaxb.addr.DocumentTypeAdd)com.xxx.generatedByJaxb.addr.ObjectFactory

...在控制台中重复多次。

编辑

当我第一次遇到冲突问题时,我重命名了冲突类,例如:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DocumentType", propOrder = { "addressPage" })
public class DocumentType {

已更改为:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DocumentTypeAddr", propOrder = { "addressPage" })
public class DocumentTypeAddr {

我重新设计了这些课程,他们知道没有任何手动更改。这里是我的错误:

两个类具有相同的XML类型名称“DocumentType”。使用@XmlType。名称和@XmlType。命名空间为它们指定不同的名称。此问题与以下位置有关:在com。xxx。由JAXB生成。地址。公共com上的DocumentType。xxx。由JAXB生成。地址。DocumentType.com。xxx。由JAXB生成。地址。对象工厂。com上的createDocumentType()。xxx。由JAXB生成。地址。ObjectFactory此问题与以下位置有关:位于com。xxx。由JAXB生成。巴尔。公共com上的DocumentType。xxx。由JAXB生成。巴尔。DocumentType.com。xxx。由JAXB生成。巴尔。对象工厂。com上的createDocumentType()。xxx。由JAXB生成。巴尔。ObjectFactory元素名{}文档具有多个映射。这个问题与以下位置有关:在公共javax。xml。绑定JAXBElement公司。xxx。由JAXB生成。巴尔。对象工厂。在com上创建文档(com.xxx.generatedByJaxb.bal.DocumentType)。xxx。由JAXB生成。巴尔。ObjectFactory此问题与以下位置有关:在公共javax。xml。绑定JAXBElement公司。xxx。由JAXB生成。地址。对象工厂。在com上创建文档(com.xxx.generatedByJaxb.addr.DocumentType)。xxx。由JAXB生成。地址。对象工厂

下面是一个xsd文件的示例(在生成类的7个xsd文件之间):

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xs:element name="Document" type="DocumentType"/>
  <xs:complexType name="DateType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="Type"/>
        <xs:attribute type="xs:int" name="Date"/>
        <xs:attribute type="xs:byte" name="HH"/>
        <xs:attribute type="xs:byte" name="MM"/>
        <xs:attribute type="xs:byte" name="SS"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="ChargeType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:short" name="Id" use="optional"/>
        <xs:attribute type="xs:float" name="Amount" use="optional"/>
        <xs:attribute type="xs:string" name="CurrCode" use="optional"/>
        <xs:attribute type="xs:byte" name="Type" use="optional"/>
        <xs:attribute type="xs:string" name="PT" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="BalancePageType">
    <xs:sequence>
      <xs:element type="DateType" name="Date"/>
      <xs:element type="ChargeType" name="Charge" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DocumentType">
    <xs:sequence>
      <xs:element type="BalancePageType" name="BalancePage"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="Sender"/>
    <xs:attribute type="xs:string" name="Id"/>
    <xs:attribute type="xs:string" name="BAId"/>
  </xs:complexType>
</xs:schema>

共有1个答案

梅修贤
2023-03-14

这不是一个完整的答案(在给定条件下不可能),但它旨在提供第一个指针。

如果你不能显示任何代码,很难帮助你。如果你原来的东西是保密的,试着做一个匿名的样品。

所以这里有一些非常普遍的建议:

  • 您的目标是消除重复类

我想对您来说,最好的方法是编写一个小的非机密示例,它仍然是演示性的,并且与您的用例相关。

 类似资料:
  • 我有一个maven模型项目,我通过maven命令-clean install生成jaxb类,jaxb类在目标文件夹下生成,jar文件在目标文件夹下生成。m2存储库文件夹。 现在在我的另一个项目中,将这个jar添加为具有适当组id和artifactId的依赖项。 但我得到的是生成的jaxb类的ClassNotFoundException和编译错误。 我正在更新我的问题以添加更多细节。 模型项目的Po

  • 问题内容: 我正在使用Java 6,JaxB 2和SpringSource Tool Suite(与Eclipse相同)。我编写了一些Java类,使用JaxB从中生成XML模式。但是,我注意到为了使用JaxB从Java对象生成XML文档的功能,我需要一个ObjectFactory。 如何生成ObjectFactory而不会浪费我现在已有的类? 问题答案: 更新 这个问题可能指的是创建一个角色的作用

  • 问题内容: 我正在使用JAXB在Maven中使用JAXB插件从XSD生成bean。一切正常,希望代码包含每个字段的isSetXXXXXX()方法。 例如 对于字段 firstName ,它将产生以下代码: 这是isSetFirstName()方法引起的问题,我不希望JAXB生成这些问题。 有没有办法阻止这种行为? 谢谢。 更新 解决此问题:问题出在xjb文件中,generateIsSetMetho

  • 几个小时以来,我一直在努力让MapStruct为JAXB生成的类生成有效的映射器。这些类的特殊性在于,它们既没有集合的setter,也没有集合的adder。例如: 类avove有一个getter和一个属性设置器(本例中为firstName),但对于集合(此处列出),它只有一个getter。因此,消费者有责任通过getAddressTypes(add(new AddressType(...))进行访

  • 手工编写类和从scheme生成JAXB类的优缺点是什么。我开始新的项目,并希望了解如何选择避免陷阱。 我有复杂的XML结构(基本上是FreeSwitch配置定义),包括不同XML级别上的可重复类型。

  • 使用这个maven插件,我能够生成我的类,并在另一个模式中重用它们;这真是太棒了! 现在我发现自己的模式需要两个插曲(从模式生成的两个不同的包)。我只是简单地尝试在XJC中添加另一个arg,但没有起作用。 然后我更改了两个参数的顺序,错误的目标是另一个模式。然后我明白了,这两集都可以,但这可能不是做事的方式。 以下是我的一些POM: 我得到的是: 新手在这里,任何帮助非常感谢:)。