#java #jaxb #eclipselink #moxy
#java #jaxb #eclipselink #moxy
Вопрос:
Есть ли способ указать MOXy в качестве моей реализации JAXB для классов домена, распределенных по нескольким пакетам Java, кроме помещения jaxb.properties
в каждый отдельный пакет?
Ответ №1:
Чтобы указать EclipseLink MOXy в качестве поставщика JAXB, вам нужно поместить jaxb.properties в один из пакетов для объектов вашего домена, который передается для начальной загрузки JAXBContext. Например, если ваш JAXBContext будет основан на следующих двух классах:
- пример.foo.Foo
- пример.bar.Bar
пример.foo.Foo
package example.foo;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import example.bar.Bar;
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
private Bar bar;
}
пример.bar.Bar
package example.bar;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import example.foo.Foo;
@XmlAccessorType(XmlAccessType.FIELD)
public class Bar {
private Foo foo;
}
пример/foo/jaxb.properties
Чтобы указать, что следует использовать реализацию JAXB MOXy, мы поместим файл jaxb.properties со следующей записью в тот же пакет, что и класс Foo.
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
ДЕМОНСТРАЦИЯ
Поскольку классы Foo и Bar ссылаются друг на друга, в конечном итоге JAXBContext будет содержать метаданные о них обоих, но в зависимости от того, как мы создаем JAXBContext, поставщик может быть другим.
package example;
import javax.xml.bind.JAXBContext;
import example.foo.Foo;
import example.bar.Bar;
public class Demo {
public static void main(String[] args) throws Exception{
System.out.println(JAXBContext.newInstance(Foo.class).getClass());
System.out.println(JAXBContext.newInstance(Bar.class).getClass());
System.out.println(JAXBContext.newInstance(Foo.class, Bar.class).getClass());
}
}
Выполнение приведенного выше кода приведет к:
class org.eclipse.persistence.jaxb.JAXBContext
class com.sun.xml.bind.v2.runtime.JAXBContextImpl
class org.eclipse.persistence.jaxb.JAXBContext
Комментарии:
1. Добавление
jaxb.properties
только к одному пакету, по-видимому, влияет только на классы в этом конкретном пакете.2. Как выполняется загрузка JAXBContext?
3. Мои тесты для проверки этого просто распечатали результат
JAXBContext.newInstance(Foo.class).getClass().getName()
для двух разных значенийFoo.class
; один в пакете, содержащемjaxb.properties
, и один в пакете, не содержащем файл. В любом случае, эта проблема менее сложна, чем мой другой вопрос, над которым, я знаю, вы сейчас работаете. Я собираюсь пока занести это в таблицу, пока не будет решена более серьезная проблема. Спасибо за вашу помощь, кстати!4. @Matt Ball — Нет проблем, я обновил свой ответ примером, демонстрирующим, как выбирается поставщик JAXB на основе файла jaxb.properties.
5. Хорошо, для меня этого достаточно. Я не уверен, как Jersey загружает свой JAXBContext, но я смог удалить
jaxb.properties
из всех пакетов, кроме 2 из 7 (и возрастающих). Спасибо за помощь.