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

使用 JDK 的不带 ns2 前缀的 JAXB

宦瀚
2023-03-14

在阅读了Oracle论坛,Stackoverflow上有关此内容的所有帖子后,java.net 我终于在这里发布。我正在使用 JAXB 创建 XML 文件,但问题是它在我的元素之前添加了著名的 ns2 前缀,我已经尝试了所有没有人为我工作的解决方案。java 版本给出“1.6.0_37”

解决方案 1:使用包信息.java

我在包含@Xml*注释类的包中创建了文件,内容如下:

@XmlSchema(
    namespace = "http://mynamespace",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns = {
        @XmlNs(namespaceURI = "http://mynamespace", prefix = "")
    }
)
package com.mypackage;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

解决方案2:NamespacePrefixMapper

我创建了以下类,并将映射器设置为封送拆收器:

// Change mapper to avoid ns2 prefix on generated XML
class PreferredMapper extends NamespacePrefixMapper {
    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
        return "";
    }
}
NamespacePrefixMapper mapper = new PreferredMapper();
try {
    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
}
catch (PropertyException e) {
   logger.info("No property for com.sun.xml.bind.namespacePrefixMapper found : " + e.getMessage());
}

使用com.sun.xml.bind.namespace的前缀映射器时什么都不会发生,使用com.sun.xml.internal.bind.namespace前缀映射器时,它会抛出异常。

我还在我的pom中添加了maven依赖项,但是JRE版本似乎有更高的优先级:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.4</version>
</dependency>

你能帮我这个忙吗?

PS:由于构建的原因,我不能将jar直接包含在我的类路径中。PS2:我不会用JDK7。提前感谢。

共有2个答案

窦凯定
2023-03-14

我今天遇到了同样的问题。生产机器安装了Java 6,当我部署我的应用程序时,我得到了ns2前缀。我是这样解决的。生产服务器只有Java 1.6补丁21

>

  • 我确保我的包中有一个package-info.java文件,其中所有的类都是使用Jaxb生成的。我检查了一下,@Xml

    在我的pom中。xml文件,我添加了jaxb-impl依赖项:com.sun.xml。绑定jaxb-impl 2.2.5-b04

    并将源和目标指定为1.6。进行了maven clean安装和打包并部署到生产环境中,一切看起来都很好。下一步是确保生产机器升级到Java7。希望这有帮助:)

  • 郎建章
    2023-03-14

    没有MOXy的实现是不可能的。JAXB如果首选前缀是“”,则生成一个新前缀。

    我过去遇到过同样的问题,我为每个包信息.java配置了每个前缀。

    NamespacePrefixMapper在JAVADOC中说

    null if there's no prefered prefix for the namespace URI.
    In this case, the system will generate a prefix for you.
    
    Otherwise the system will try to use the returned prefix,
    but generally there's no guarantee if the prefix will be
    actually used or not.
    
    return "" to map this namespace URI to the default namespace.
    Again, there's no guarantee that this preference will be
    honored.
    
    If this method returns "" when requirePrefix=true, the return
    value will be ignored and the system will generate one"
    

    否则,如果使用包信息

    we know we can't bind to "", but we don't have any possible name at hand.
    generate it here to avoid this namespace to be bound to "".
    

    我希望我已经给了你关于你的问题的所有答案。

     类似资料:
    • 我对spring boot和创建我的第一个应用程序非常陌生。创建数据源时,我使用了带有前缀的@ConfigurationProperties和要从Application.Property中读取的属性。 但是,这个设置似乎对我不起作用,我的程序没有运行。 我的pom.xml文件包含: 我的存储库类: 我的主要类: 请让我知道如果我需要提供任何其他信息以及。

    • 我正在尝试利用Laravel的登录页路径。例如,默认情况下,Laravel会将您带到欢迎页面,并且斜杠后没有url文本。 在我的欢迎页面中,我使用以下条件根据路线名称应用样式。 然而,此代码不工作。如何正确查看欢迎页面的路线? 编辑:使用“请求”而不是“路由”使其工作。然而,为了保持一致性,我想知道是否也可以使用“路线”来完成。

    • 问题内容: 我有一个使用默认名称空间打印的文件。元素以ns2前缀打印,我需要将其删除,以及与我的代码的关系: 我希望它是: 这就是我的编码方式,据我所知,这足以使ns2消失: 生成的package-info结果如下: 我创建如下文件: generateClassesPackage是其中package-info.java及其元素所在的包。 Foo对象已定义,并具有以下元素: 我错过了吗?还是我误解了

    • 问题内容: 我有一个名为“ seeder”的软件包: 现在我想用MyFunc前缀调用所有函数 我想要这样的东西: 这个输出: EDIT1 :在此示例中,parentKey是在循环中更改的字符串变量 但是GC说: 使用没有选择器的包播种机 问题答案: 您无法通过函数名称获得函数,而这正是您想要做的。原因是,如果Go工具可以检测到未显式引用某个函数(因此无法访问该函数),则该函数甚至可能无法编译为可执

    • 问题内容: 如何删除所有都有前缀的表? 注意:需要在phpMyAdmin中执行 问题答案: 您不能仅使用单个MySQL命令来完成此操作,但是可以使用MySQL为您构造该语句: 在MySQL Shell中或通过PHPMyAdmin,使用以下查询 这将生成一个DROP语句,然后您可以复制并执行该语句以删除表。 编辑:此处免责声明- 上面生成的语句将删除所有带有该前缀的数据库中的所有表。如果要将其限制为

    • 问题内容: Python2.7 argparse仅在互斥组中接受可选参数(前缀): $ mydaemon -h 有没有一种方法可以使argparse参数的行为类似于传统的unix守护程序控件: 问题答案: 对于其中的所有功能和选项,我认为您永远不会获得看起来像您想要的“罐头”用法字符串。 也就是说,自您的原始帖子起,您是否查看过子解析器? 这是一个准系统的实现: 使用选项运行此命令将产生: 这种方