我有一种情况需要为我的jaxb类动态设置命名空间。我在jaxb类中的命名空间有一个需要动态更改的版本。
@XmlRootElement(name = "myobject",namespace="http://myhost.com/version-2")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public class myObject{
}
当我使用这种静态命名空间机制时,我的编组工作非常完美,但在我的实际情况中,我需要动态更改此版本。
我在编组时尝试了这种方法来解决这个问题
XMLStreamWriter xmlStreamWriter =
XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter);
String uri = "http://myhost.com/ver-"+version;
//xmlStreamWriter.setDefaultNamespace(uri);
xmlStreamWriter.writeStartDocument("1.0");
xmlStreamWriter.writeNamespace("ns1", uri);
我尝试使用setDefaultNamespace不成功,writeNamespace给我一个错误 无效状态:在writeNamespace
处未打开start标记高度赞赏任何关于如何解决这个问题的意见。
答案 0 :(得分:2)
您可以实现一个XMLStreamWriter
委托对原始作者的所有调用,但会覆盖writeNamespace(...)
方法:
public void writeNamespace(String prefix, String uri) {
if ("http://myhost.com/version-2".equals(uri) {
uri = "http://myhost.com/version-" + version;
}
delegate.writeNamespace(prefix, uri);
}
答案 1 :(得分:1)
您是否考虑过使用XSL-T转换?根据您的架构,在编组后替换命名空间可能相对简单。