2012-04-30 4 views
2

Я пытаюсь правильно вывести атрибут 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, переданный любому из этих типов.

ответ

3

Вам нужно взять руку на свой пакет (например, используя ROOTELEMENT.class.getPackage(), если ROOTELEMENT находится в нужном вам пакете). Затем вы можете просто обработать его следующим образом:

Package package = // Here retrieve the package; 
String namespace = package.getAnnotation(XmlSchema.class).namespace(); 
...etc... 
+0

Это сработало. Рад узнать что-то новое. Спасибо. Однако я ожидаю, что JAXB предоставит менее «ручной» способ достичь этого. На данный момент я оставлю ответ неприемлемым, если появится еще один элегантный вариант. –

+1

+1 - @ XaviLópez - JAXB (JSR-222) в настоящее время не предлагает API для интроспекции метаданных (возможно, он должен предлагать что-то вроде JPA). Примером здесь является, вероятно, ваш лучший выбор. –