Указание среды выполнения MOXy для нескольких пакетов Java

#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 (и возрастающих). Спасибо за помощь.