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

JAXB错误:有多个映射。由于两个对象工厂使用同一个Bean

贺运良
2023-03-14

我有两个Maven JAXB项目。

答:主Maven JAXB存根XSD项目,这个包含BASKET. xsd

B:Maven JAXB stubs用户项目,该项目想要包装篮子。在自己的对象中使用xsd。

这将导致两个对象工厂(不同的包),都声明了以下内容。。。

@XmlElementDecl(namespace = "http://www.bob.org/bob/namespace/", name = "Basket")
public JAXBElement<BasketType> createBasket(BasketType value) {
    return new JAXBElement<BasketType>(QNAME, BasketType.class, null, value);
}

这一代是通过这个插件完成的。。。组织。jvnet。jaxb2。maven2 maven-jaxb2-plugin 0.13.2

在应用程序启动时,我看到CXF RT Frotnend JaxRS 3.1.11给了我一个错误。。。

017-07-03 14:38:54,613845801: WARN  : [RMI TCP Connection(3)-127.0.0.1] [] org.apache.cxf.jaxrs.utils.ResourceUtils: No JAXB context can be created
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
The element name {http://www.bob.org/bob/namespace/}Basket has more than one mapping.
    this problem is related to the following location:
        at public javax.xml.bind.JAXBElement com.bob.bean.ObjectFactory.createBasket(org.bob.BasketType)
        at com.bob.bean.ObjectFactory
    this problem is related to the following location:
        at public javax.xml.bind.JAXBElement org.userservice.bean.ObjectFactory.createBasket(org.bob.BasketType)

这不是一个错误,直到我从CXF 2.7.7升级到3.1.11

有人知道有没有办法让maven-jaxb2-plugin不生成方法createBasket(…)在UserService ObjectFactory上??

或者让CXF在两个ObjectFactory类上接受两个相同的方法?

共有2个答案

哈襦宗
2023-03-14

与您的项目一样,我的项目有两个包,其中包含具有相同元素名称和命名空间的相同类。从我得到的信息来看,这混淆了编组过程,因为JAXB无法准确地判断应该使用哪个映射来解析XML和Java对象。

正如您所见,运行时错误非常相似:

The element name {http://schemas.foobar.com/2021/12/01/ws/platform/coretypes}Identifiers has more than one mapping.
        this problem is related to the following location:
                at public javax.xml.bind.JAXBElement myapp.visit.com.foobar.schemas._2021._12._01.ws.platform.coretypes.ObjectFactory.createIdentifiers(myapp.visit.com.foobar.schemas._2021._12._01.ws.platform.coretypes.Identifiers)
                at myapp.visit.com.foobar.schemas._2021._12._01.ws.platform.coretypes.ObjectFactory
                at protected javax.xml.bind.JAXBElement myapp.visit.com.foobar.schemas._2021._12._01.ws.platform.coretypes.Coding.nameOther
                at myapp.visit.com.foobar.schemas._2021._12._01.ws.platform.coretypes.Coding
                at protected myapp.visit.com.foobar.schemas._2021._12._01.ws.platform.coretypes.Coding myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.clinician.ClinicianRole.clinicianRoleType
                at myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.clinician.ClinicianRole
                at protected java.util.List myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.clinician.ArrayOfClinicianRole.clinicianRole
                at myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.clinician.ArrayOfClinicianRole
                at public myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.clinician.ArrayOfClinicianRole myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.clinician.ObjectFactory.createArrayOfClinicianRole()
                at myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.clinician.ObjectFactory
        this problem is related to the following location:
                at public javax.xml.bind.JAXBElement myapp.appointment.com.foobar.schemas._2021._12._01.ws.platform.coretypes.ObjectFactory.createIdentifiers(myapp.appointment.com.foobar.schemas._2021._12._01.ws.platform.coretypes.Identifiers)
                at myapp.appointment.com.foobar.schemas._2021._12._01.ws.platform.coretypes.ObjectFactory
                at protected javax.xml.bind.JAXBElement myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.appointment.AppointmentLink.appointmentIdentifier
                at myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.appointment.AppointmentLink
                at public javax.xml.bind.JAXBElement myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.appointment.ObjectFactory.createAppointmentLink(myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.appointment.AppointmentLink)
                at myapp.visit.com.foobar.schemas._2021._12._01.ws.pas.appointment.ObjectFactory

我的解决方案虽然略有不同。这些类是由 wsimport 工具生成的,所以我提供了一个带有 generateElementProperty="false" 的绑定文件,以强制该工具在代码中抛弃 JAXBElement 泛型,这会影响映射是如何生成的。

我的绑定文件最终是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings jaxb:version="2.0"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" jaxb:extensionBindingPrefixes="xjc">
  <jaxb:globalBindings generateElementProperty="false"/>
</jaxb:bindings>

...因此,我可以在shell中使用以下命令调用wsimport

path-to-your-jdk/bin/wsimport -verbose -extension -keep -Xnocompile -d your-target-dir your-schema.xml -b your-binding-file.xjb

它取代了JAXBElement

周和歌
2023-03-14

我的解决方案是改变

<property name="singleJaxbContext" value="true"/>

<property name="singleJaxbContext" value="false"/>

例如在我的 application-config.xml

  <bean id="jaxbextprovider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
    <property name="singleJaxbContext" value="false"/>
  </bean>
 类似资料:
  • 当我映射同一个实体时,就像这里回答的那样: Hibernate与同一实体的多对多关联 在“tbl_friends”表中,我有相同含义的行。例如,我有id=1的用户和id=2的用户。在“tbl_friends”表中,当他们作为朋友链接时,我有两行 使用Hibernate或JPA引用是否可以在一行(1-2或2-1)中建立这种关系?

  • 我有两个这样的等级: 和 我想使用hibernate持久化这两个类。字段messagesOfTypeA、messagesOfTypeB和messagesOfTypeC根据消息中的类型字段对消息对象进行分组。 如何使用XML hibernate映射映射MyClass和Message之间的一对多关系?(我正在使用Hibernate 3.6)

  • 假设我有这样的映射: 现在,我需要将子列表映射到子列表,但它们都有相同的父对象。我希望这样做: 但不管用,有机会做吗?

  • 我正在尝试编写一个简单的应用程序,其中包含一个跟踪每个用户支付的款项的表和一个包含每个用户支付的总金额(所有付款的总和)的第二个表。目前,两个表都有相同的字段(firstName、lastName、金额),我已经将它们从同一个Java类映射到多个表,我无法将该类映射到多个表。对此有什么简单的解决方案吗?

  • 我有两个地图,键为整数,值为双倍。 我想创建第三个按键排序的映射,值将是两个映射的双精度列表。 地图1: Map2: 最终地图: 如上所述,如果一个地图中的一个键在另一个地图中丢失,则另一个地图的最终地图中的值应默认为0.00 我可以使用putAll方法将所有键放入第三张地图。但如何按照我的意愿设定这些值呢? 感谢阅读!

  • 对特定的持久化类,映射多次是允许的。这种情形下,你必须指定 entity name 来区别不同映射实体的对象实例。(默认情况下,实体名字和类名是相同的。) Hibernate 在操作持久化对象、编写查询条件,或者把关联映射到指定实体时,允许你指定这个 entity name(实体名字)。 <class name="Contract" table="Contracts" entity