在jaxb编组中动态设置对象的命名空间

时间:2012-03-24 15:46:37

标签: xml xml-serialization jaxb marshalling jaxb2

我有一种情况需要为我的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标记

高度赞赏任何关于如何解决这个问题的意见。

2 个答案:

答案 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转换?根据您的架构,在编组后替换命名空间可能相对简单。