代码之家  ›  专栏  ›  技术社区  ›  f0rb1dd3n403

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

  •  2
  • f0rb1dd3n403  · 技术社区  · 11 年前

    我已经使用jaxb 2.2.6的xjc从xsd文件中生成了一组类。 通过编辑“package-info.java”,我将前缀值关联到了不同的命名空间。 因此,我创建了一个带有main的测试类,用于取消对xml文件的编组,编辑一些信息,并以xml格式编组对象。 一切都像一个魅力和javax.xml.bind.Marshaller对象匹配正确的名称空间和前缀在包信息中定义。

    当我在同一台机器中的tomcat7上使用axis2将该应用程序部署为WS时,并调用执行上述代码的WS方法javax.xml.bind.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/Tomcat7WS应用程序”中执行代码时会获得此输出):

    .....
      <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 回复  |  直到 11 年前
        1
  •  1
  •   bdoughan    11 年前

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