Проблема с путями к классам Moxy

Я реализовал Moxy для некоторых классов в моем проекте. Но я не хочу, чтобы Moxy использовался по умолчанию для всех существующих классов. Но проблема, с которой я столкнулся, заключается в том, что Moxy используется для всех других существующих классов. Как я могу этого избежать?

Я убедился, что jaxb.properties находится в том же пакете, что и классы, для которых я хочу его использовать, и в этом нет другого класса. Моя структура пакета выглядит следующим образом:

пакет :com.entity.a com.entity.b com.entity.c com.entity.d com.entity.d.moxy.

jaxb.properties присутствует в com.entity.d.moxy, и все классы в com.entity.d.moxy должны использовать только его. Но все классы подхватывают мокси и вызывают исключения.

Может ли кто-нибудь помочь?


person user2582635    schedule 15.07.2013    source источник
comment
Добро пожаловать в Stack Overflow! Вам не нужно включать подпись в свои посты - ваша карточка пользователя всегда автоматически размещается внизу поста.   -  person Artemix    schedule 15.07.2013


Ответы (1)


Возвращенный JAXBContext всегда будет исходить от одного поставщика. Ниже я продемонстрирую, как определяется провайдер на примере.

ПАКЕТ №1 – forum17649220.foo

jaxb.properties

Этот пакет содержит файл jaxb.properties со следующей записью, указывающей, что MOXy является поставщиком JAXB (см.: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html).

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Фу

Foo содержит ссылку на Bar. Это означает, что независимо от того, как создается JAXBContext, при обработке Foo метаданные также будут созданы для Bar.

package forum17649220.foo;

import forum17649220.bar.Bar;

public class Foo {

    public Bar bar;

}

jaxb.index

Реализации JAXB не выполняют сканирование пакетов. Файл jaxb.index можно использовать для создания JAXBContext по имени пакета.

Foo

ПАКЕТ №2 — forum17649220.bar

Панель

Bar содержит ссылку на Foo. Это означает, что независимо от того, как создается JAXBContext, при обработке Bar метаданные также будут созданы для Foo.

package forum17649220.bar;

import forum17649220.foo.Foo;

public class Bar {

    public Foo foo;

}

jaxb.index

Bar

ДЕМО-КОД

Мы создадим экземпляры JAXBContext несколькими различными способами, чтобы увидеть, что выбрано в качестве провайдера JAXB. Обратите внимание, что поскольку Foo и Bar имеют ссылки друг на друга, метаданные для обоих классов будут обрабатываться независимо от используемого провайдера JAXB.

Демо

package forum17649220;

import javax.xml.bind.JAXBContext;
import forum17649220.bar.Bar;
import forum17649220.foo.Foo;

public class Demo {

    public static void main(String[] args) throws Exception {
        System.out.println(JAXBContext.newInstance("forum17649220.foo").getClass());
        System.out.println(JAXBContext.newInstance("forum17649220.foo:forum17649220.bar").getClass());
        System.out.println(JAXBContext.newInstance("forum17649220.bar").getClass());

        System.out.println(JAXBContext.newInstance(Foo.class).getClass());
        System.out.println(JAXBContext.newInstance(Foo.class, Bar.class).getClass());
        System.out.println(JAXBContext.newInstance(Bar.class).getClass());
    }

}

Вывод

Из входных данных видно, что всякий раз, когда пакет forum17649220.foo или класс из этого пакета включается при создании JAXBContext, MOXy будет провайдером из-за файла jaxb.properties.

class org.eclipse.persistence.jaxb.JAXBContext
class org.eclipse.persistence.jaxb.JAXBContext
class com.sun.xml.bind.v2.runtime.JAXBContextImpl
class org.eclipse.persistence.jaxb.JAXBContext
class org.eclipse.persistence.jaxb.JAXBContext
class com.sun.xml.bind.v2.runtime.JAXBContextImpl
person bdoughan    schedule 15.07.2013