Определите пространства имен Spring JAXB без использования NamespacePrefixMapper

[Сильно отредактировано, как понимание прогрессирует]

Можно ли заставить Spring Jaxb2Marshaller использовать пользовательский набор префиксов пространства имен (или, по крайней мере, уважать те, которые указаны в файле схемы / аннотациях) без необходимости использовать расширение NamespacePrefixMapper?

Идея состоит в том, чтобы иметь класс с отношением «имеет» к другому классу, который, в свою очередь, содержит свойство с другим пространством имен. Чтобы лучше проиллюстрировать это, рассмотрим следующую схему проекта, в которой используется JDK1.6.0_12 (последнее, что я могу получить на работе). У меня есть следующее в пакете org.example.domain:

Main.java:

package org.example.domain;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class Main {
  public static void main(String[] args) throws JAXBException {
    JAXBContext jc = JAXBContext.newInstance(RootElement.class);

    RootElement re = new RootElement();
    re.childElementWithXlink = new ChildElementWithXlink();

    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(re, System.out);
  }

}

RootElement.java:

package org.example.domain;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(namespace = "www.example.org/abc", name="Root_Element")
public class RootElement {
  @XmlElement(namespace = "www.example.org/abc")
  public ChildElementWithXlink childElementWithXlink;

}

ChildElementWithXLink.java:

package org.example.domain;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;

@XmlRootElement(namespace="www.example.org/abc", name="Child_Element_With_XLink")
public class ChildElementWithXlink {
  @XmlAttribute(namespace = "http://www.w3.org/1999/xlink")
  @XmlSchemaType(namespace = "http://www.w3.org/1999/xlink", name = "anyURI")
  private String href="http://www.example.org";

}

package-info.java:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://www.example.org/abc",
    xmlns = {
          @javax.xml.bind.annotation.XmlNs(prefix = "abc", namespaceURI ="http://www.example.org/abc"),
          @javax.xml.bind.annotation.XmlNs(prefix = "xlink", namespaceURI = "http://www.w3.org/1999/xlink")
            }, 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
    package org.example.domain;

Запуск Main.main () дает следующий вывод:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Root_Element xmlns:ns1="http://www.w3.org/1999/xlink" xmlns:ns2="www.example.org/abc">
<ns2:childElementWithXlink ns1:href="http://www.example.org"/>
</ns2:Root_Element>

тогда как то, что я хотел бы, это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<abc:Root_Element xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:abc="www.example.org/abc">
<abc:childElementWithXlink xlink:href="http://www.example.org"/>
</abc:Root_Element>

Как только эта часть заработает, проблема переходит к настройке Jaxb2Marshaller в Spring (Spring 2.5.6, где Spring-oxm-tiger-1.5.6 предоставляет Jaxb2Marshaller), так что он обеспечивает то же самое с помощью простой настройки контекста и вызов маршалу ().

Спасибо за ваш постоянный интерес к этой проблеме!

Ответы на вопрос(4)

Ваш ответ на вопрос