【问题标题】:JAXB namespace prefixes missing缺少 JAXB 命名空间前缀
【发布时间】:2011-09-11 18:02:19
【问题描述】:

我已经从 XSD 生成了 Java 类,从解组的角度来看一切正常。

但是,当我从 JAXB 类中编组时,我得到以下信息:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns="http://poc.cmc.com/ScreenLayout">
    <Data>
        <Type>Sample</Type>
     . . .
</message>

但我需要

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns0:message xmlns:ns0="http://poc.cmc.com/ScreenLayout">
    <ns0:Data>
        <ns0:Type>Sample</ns0:Type>
    . . .

如何通过 Java 控制它?

非常感谢

【问题讨论】:

  • 第一个列表完全有效;它的默认命名空间设置为“http://poc.cmc.com/ScreenLayout”。为什么需要命名空间前缀?
  • 您好,因为消费应用程序非常笨,需要前缀,我们无法控制它

标签: java jaxb


【解决方案1】:

我执行了以下步骤,一切正常。基本上,我已经从 wsdl 或您拥有的任何架构文件中编译了。

  1. 从下载 https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/(我用的是2.3.4版本)
  2. 使用以下命令:
xjc.sh -wsdl -npa -mark-generated -d src/main/java -p your.package.hierarchy src/main/resources/wsdl/*

我有 wsdl 文件,这就是第一个标志的原因,-npa 是在注释中而不是在 package-info.java 中添加命名空间信息,因为由于某种原因这对我不起作用。

【讨论】:

    【解决方案2】:

    您可以在package-info 类上使用@XmlSchema 注释来为命名空间分配前缀:

    @XmlSchema(
        namespace = "http://poc.cmc.com/ScreenLayout",
        elementFormDefault = XmlNsForm.QUALIFIED,
        xmlns={@XmlNs(prefix="ns0", namespaceURI="http://poc.cmc.com/ScreenLayout")})    
    package your.package;
    
    
    import javax.xml.bind.annotation.*;
    

    【讨论】:

    • 没有测试,但这会很好。不幸的是,生成了 java 文件,因此您需要构建过程来将此自定义文件放置在与生成的文件相同的位置...
    • 我没有得到的是我的项目中有近 20 个包信息类。我需要添加哪一项@XmlNs 信息?
    • @hellzone - 以下链接可能会有所帮助:blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html
    • @blaise 我在我的网络服务中采用了这种方法。我们在 websphere8.5 中使用 cxf2.1.7 和 jaxb 2.1.7。但我得到前缀'a'而不是ns2。我怎样才能回到ns2?相同的应用程序和相同的 jar 工作正常,并且在 websphere 7 上正确生成了请求。此问题仅在 websphere8.5 中出现。有什么建议吗?
    【解决方案3】:

    不能将此作为评论发布!

    因为消费应用非常笨,需要前缀

    在这种情况下,愚蠢的应用程序并没有真正使用 xml。看看这个链接http://bdoughan.blogspot.com/2010/08/jaxb-namespaces.html 并使用命名空间选项。具体

    @XmlSchema (
       xmlns = {
             @javax.xml.bind.annotation.XmlNs(prefix = "ns1", namespaceURI="http:test"),
             @javax.xml.bind.annotation.XmlNs(prefix = "xsd", namespaceURI="http:www.w3.org2001XMLSchema")
       },
       namespace = "http:test",
       elementFormDefault = XmlNsForm.UNQUALIFIED,
       attributeFormDefault = XmlNsForm.UNSET
    )
    

    在 package-info.java 文件中使用。

    @XmlType(namespace="http://www.example.org/type")
    

    用于类声明

    @XmlElement(namespace="http://www.example.org/property")
    

    用于属性。

    这些选项的某些组合或仅其中一个选项可能会满足您的需求。但是,您应该明白,当您从有效的 xml 迁移到必须在所有元素上包含特定命名空间前缀的 xml 时,您正在打一场艰苦的战斗。

    【讨论】:

      【解决方案4】:

      根据 XML 规范,两个 xml 是相同的,因为 xmlns="" 定义了适用于当前和所有子元素的默认命名空间。 在这两种情况下,XML 解析器都应该为您提供相同的 DOM 或 SAX

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多