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

Tomcat 7上AXIS2 WebService应用程序中的JAXB名称空间转换

董法
2023-03-14

我使用jaxb 2.2.6的xjc从xsd文件生成了一组类。通过编辑“package-info.java”,我将前缀值与不同的命名空间相关联。所以我创建了一个测试类,它的主要功能是解组xml文件,编辑一些信息,并以xml格式列出对象。一切都像一个魅力一样工作,javax.xml.bind.Marshaller对象正确匹配包信息中定义的命名空间和前缀。

当我在同一台机器上使用tomcat7上的axis2将这个应用程序部署为WS,并调用一个执行上面描述的代码javax.xml.bind的WS方法时。Marshaller使用默认名称空间(ns1,ns2….)创建一个xml文件。

我使用的package-info.java是这样的:

@javax.xml.bind.annotation.XmlSchema(
        namespace = "....", 
        xmlns = {   
                @XmlNs(namespaceURI = "....", prefix = "myprefix"),
                @XmlNs(namespaceURI = "...", prefix = "myprefix2"),
            },
        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package ....;

import javax.xml.bind.annotation.XmlNs; 

这是一段正确的输出(这个输出是我作为“Java应用程序”执行代码时获得的):

.....
    <ContactInformation>
        <rm:ContactDescription>ASD</rm:ContactDescription>
        <rm:ContactRole>ASD</rm:ContactRole>
        <rm:ContactLocation/>
        <rm:AdditionalContactInformation>
            <xnl:PartyName>
                <xnl:PersonName>
                    <xnl:NameElement xnl:ElementType="FirstName">ASD</xnl:NameElement>
                    <xnl:NameElement xnl:ElementType="LastName">ASD</xnl:NameElement>
                </xnl:PersonName>
                <xnl:OrganisationName>
                    <xnl:NameElement>ASD</xnl:NameElement>
                </xnl:OrganisationName>
            </xnl:PartyName>
        </rm:AdditionalContactInformation>
    </ContactInformation>
......

这是一个错误的输出(当我在“Axis2/Tomcat7 WS 应用程序”中执行代码时获得此输出):

.....
  <ContactInformation>
        <ns2:ContactDescription>ASD</ns2:ContactDescription>
        <ns2:ContactRole>ASD</ns2:ContactRole>
        <ns2:ContactLocation/>
        <ns2:AdditionalContactInformation>
            <ns7:PartyName>
                <ns7:PersonName>
                    <ns7:NameElement ns7:ElementType="FirstName">ASD</ns7:NameElement>
                    <ns7:NameElement ns7:ElementType="LastName">ASD</ns7:NameElement>
                </ns7:PersonName>
                <ns7:OrganisationName>
                    <ns7:NameElement>ASD</ns7:NameElement>
                </ns7:OrganisationName>
            </ns7:PartyName>
        </ns2:AdditionalContactInformation>
    </ContactInformation>
......

对于每种情况,都存在一个package-info.java,其中声明了名称空间转换。

我该如何解决这个问题?

共有1个答案

商宝
2023-03-14

JAXB(JSR-222)实现不需要使用@XmlSchema注释中定义的前缀。使用的前缀并不重要,JAXB(JAX-WS)实现之间的命名空间限定将是相同的,尽管前缀可能不同。

 类似资料:
  • 问题内容: 这是我的xml,需要将其转换为Java。我用过jaxb 并引发以下异常javax.xml.bind.UnmarshalException:意外元素(uri:“ http://www.ae.com/Event/Load ”,本地:“ Order”)。期望的元素是<{} lm:Order> 这是我的解组代码 订购Pojo班 您能否也帮助我阅读,当前正在读取文件,需要读取为XML Strin

  • 面临使用JAXB解组的问题。我需要使用多个名称空间。Java类是为第三方提供的XSD生成的。因此,我不想在Java类中的XMLRootElement指定名称空间,也不想手动更改多个类。 编组逻辑如下: xmlelement类TokenRequest.java BasicInRequestType.java 我在package-info.java中指定了前缀 TokenRequest元素实际上引用了

  • 我正在开发一个客户端来使用 Web 服务,但由于某种原因,除非所有命名空间都正确且没有任何前缀,否则我的请求没有得到正确处理。 我所有的类都是由服务提供商使用提供的XSD和WSDL创建的。 NfeDadosMsg.class 包装信息.java TConsStatServ.class package br.inf.portalfiscal.nfe; 包装信息.java 输出xml: 由于某种原因,

  • 我已经阅读了这里的文章和在使用JAXB时处理数字签名的示例代码,并且遇到了一个问题,我认为是JAXB封送将名称空间引入“signedinfo”元素。 我定义了一个XSD,它将被用不同编程语言实现的多个应用程序使用。我将XSD编译为JAXB注释类,供我的实现(Jersey JAX-RS和JAX-WS)使用。我目前拥有的流量如下: JAXB对象使用适当的数据创建或从远程应用程序传递。 按照Blaise

  • 我想知道是否有一种方法来强制JAXB创建与XSD模式相同的名称空间前缀。即,即使我从一个包含xmlns:cts=“http://cts.com”的模式创建JAXB类,在封送类之后,我得到一个具有xmlns:ns1前缀的XML。我知道我可以通过使用NamespacePrefixMapper类来重写这些,但是为什么我需要在我的XSD明确定义了默认前缀的情况下手动执行此操作呢?在我当前的XML中有大量的

  • 我正在尝试使用jaxb创建XML,如下所示,其中子元素有单独的命名空间。 我的班级 但我正在像下面这样生成xml,其中子模式位于根级别。 我在package-info.java定义了@xmlschema 当我生成xml时,子元素的名称空间没有被生成,我只得到根元素的命名空间。