динамическое задание пространства имен объектов в jaxb marshalling - PullRequest
3 голосов
/ 24 марта 2012

У меня есть ситуация, когда мне нужно динамически настроить пространства имен для моих классов 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

Любая информация о том, как это можно решить, высоко ценится.

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Вы можете реализовать 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 голос
/ 25 марта 2012

Рассматривали ли вы использование преобразования XSL-T?В зависимости от вашей схемы может быть относительно просто заменить пространство имен после сортировки.

...