使用JDK';不带ns2前缀的s JAXB
在阅读了Oracle论坛、Stackoverflow、java.net上关于此的所有帖子之后,我终于在这里发布了。 我正在使用JAXB创建XML文件,但问题是它在我的元素之前添加了著名的ns2前缀,我尝试了所有没有人为我工作的解决方案。 java版本给出了“1.6.0_37” 解决方案1:使用package info.java 我在包中创建了包含@Xml*注释类的文件,内容如下:使用JDK';不带ns2前缀的s JAXB,jaxb,xml-namespaces,Jaxb,Xml Namespaces,在阅读了Oracle论坛、Stackoverflow、java.net上关于此的所有帖子之后,我终于在这里发布了。 我正在使用JAXB创建XML文件,但问题是它在我的元素之前添加了著名的ns2前缀,我尝试了所有没有人为我工作的解决方案。 java版本给出了“1.6.0_37” 解决方案1:使用package info.java 我在包中创建了包含@Xml*注释类的文件,内容如下: @XmlSchema( namespace = "http://mynamespace", elem
@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.namespacePrefixMapper,什么都不发生,对于com.sun.xml.internal.bind.namespacePrefixMapper,它抛出异常
我还在pom中添加了maven依赖项,但JRE版本的优先级似乎更高:
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.4</version>
</dependency>
com.sun.xml.bind
jaxb impl
2.2.4
你能帮我吗
PS:由于构建原因,我不能直接将jar包含在我的类路径中。
PS2:我不能使用JDK7。
提前感谢。没有MOXy的实施是不可能的。JAXB如果首选前缀为“”,它将生成一个新前缀 我过去也遇到过同样的问题,我为每个package-info.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 "".
我希望我已经给了你关于你问题的所有答案。我今天也有同样的问题。生产机器有Java6,当我部署我的应用程序时,我得到了ns2前缀。我就是这样解决的。生产服务器只有Java 1.6修补程序21
仅供参考,删除ns2只适用于JDK7(可能也适用于其他新的JAXB实现),但使用的是前面提到的简单包结构,但我需要重用域模型类,然后我也有了。PS重命名工作正常。您能告诉我如何在使用
Moxy
创建QName
时添加正确的namespace URI
和prefix
?我已将我的问题张贴在这里,如果可能的话,请查看并提供您对基于Moxy
的实施的建议: