Я пытаюсь правильно вывести атрибут schemaLocation
при сортировке экземпляра генерируемого класса xjc
. Класс корневого элемента выглядит следующим образом:Получение пространства имен @XmlType во время выполнения
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"rootElement"
})
@XmlRootElement(name = "ROOTELEMENT")
public class ROOTELEMENT {
// Members
}
Я вижу, что есть package-info.java
класса сидит в пакете, где все сгенерированные классы, со следующим содержанием:
@javax.xml.bind.annotation.XmlSchema(
namespace = "http://my.own.namespace",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package my.generated.classes.package;
Ответ на JAXB XJC code generation - “schemaLocation” missing in xml generated by Marshaller предлагает установку Marshaller.JAXB_SCHEMA_LOCATION
собственности, и это действительно работает:
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://my.own.namespace my_schema.xsd");
Но я хотел бы, чтобы не вводить в пространство имен, как:
String namespace = getNamespace(rootElementInstance);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, namespace + " my_schema.xsd");
Буду признателен за рекомендации по использованию функции getNamespace()
.
EDIT: Я видел, что XmlRootElement
и XmlType
аннотаций имеют namespace()
метод, который, кажется, что я после (на самом деле, они, кажется, передать на XmlSchema
предоставленной в package-info.java
). Тем не менее, я не могу получить экземпляр ROOTELEMENT
, переданный любому из этих типов.
Это сработало. Рад узнать что-то новое. Спасибо. Однако я ожидаю, что JAXB предоставит менее «ручной» способ достичь этого. На данный момент я оставлю ответ неприемлемым, если появится еще один элегантный вариант. –
+1 - @ XaviLópez - JAXB (JSR-222) в настоящее время не предлагает API для интроспекции метаданных (возможно, он должен предлагать что-то вроде JPA). Примером здесь является, вероятно, ваш лучший выбор. –