Использование реализации MOXY JAXB с использованием аннотаций, основанных на отображении на лету

Я пишу приложение RESTful WS с использованием библиотеки RESTEasy. Я искал способ динамического изменения определенного отображения модели /xml и нашел реализацию MOXY JAXB.

Проблема в том, что когда я указываю реализацию MOXY с помощью файла jaxb.properties, при попытке получить JAXBContext я получаю следующее исключение:

javax.xml.bind.JAXBException: 
Exception Description: Name collision.  Two classes have the XML type with uri http://www.w3.org/2001/XMLSchema and name anyType.
 - with linked exception:
[Exception [EclipseLink-50007] (Eclipse Persistence Services - 2.6.0.v20130912-6b5e067): org.eclipse.persistence.exceptions.JAXBException

Такое исключение не возникает при использовании RESTEasy JAXB. Я пытался удалить все @XMLElement, чтобы избежать ссылок на некоторые неизвестные классы, но ничего не работает. Вот определение класса:

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.NONE)
public class User extends HistorizedObject implements java.io.Serializable
{
    @XmlElement(name="refNumber")
    private String m_ref;

    ...
}

И как я пытаюсь получить JAXBContext:

JAXBContext jaxbContext = JAXBContext.newInstance(User.class);

Нет понятия о том, какие классы сталкиваются. У тебя есть идея?

Спасибо

РЕДАКТИРОВАТЬ:

Вот мой файл jaxb.properties, расположенный в том же пакете, что и класс User:

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

Вот определение класса HistorizedObject, расположенное в другом пакете, чем класс User:

    @XmlAccessorType(XmlAccessType.NONE)
    public abstract class HistorizedObject implements PersistentObject, Cloneable{

        @XmlElement(name="userCreate")
        protected String userCreate="";

        @XmlElement(name="userUpdate")
        protected String userUpdate; 

        ...
}

Мое приложение работает под JBoss 4.2.3GA с использованием RestEasy 2.3.5. Используемая мной версия сборки moxy указана в сообщении об исключении выше. Дайте мне знать, если вам нужна дополнительная информация.

EDIT2:

Получение JAXBContext, когда я указываю класс Login (находится в том же пакете, что и User), работает нормально. Аннотации в классе Login такие же, как в классе User, поэтому очевидно, что что-то в исходном коде этого класса вызывает исключение. Проблема в том, что этот класс имеет длину 3000 строк... У вас есть идеи, где и что я должен начать искать?

Вот определение класса класса Login:

@XmlRootElement(name = "login")
@XmlAccessorType(XmlAccessType.NONE)
public class Login extends HistorizedObject implements java.io.Serializable
{

    /** Email address */
    @XmlElement(name="emailAddress")
    private String m_email;

    ...
}

EDIT3:

Итак, я нашел что-то интересное. Вот код внутри класса User, приводящий к конфликту имен:

public static final HashMap<String, Object[]> USERTYPEOFELEM;
    static
    {
        USERTYPEOFELEM = new HashMap<String, Object[]>();
        USERTYPEOFELEM.put("GENDER", new Object[]{Constants.IMPORT_LISTOFVALUE, "gender"});
        ...
    }

Я понимаю, что объекты в этой HashMap могут быть неразрешенными и сталкиваться, но эта хэш-карта не аннотирована и не должна быть упорядочена тогда, верно? Это ошибка в реализации MOXY или я что-то упустил?

1 ответ

Решение

Примечание: я являюсь лидером EclipseLink JAXB (MOXy) и являюсь членом экспертной группы JAXB (JSR-222).

Решение

По результатам автономного разговора решение проблемы заключалось в использовании следующего пакета EclipseLink:

  • org.eclipse.persistence.asm

В сочетании с пакетами EclipseLink, которые уже использовались:

  • org.eclipse.persistence.core
  • org.eclipse.persistence.moxy

причина

Байт-код MOXy генерирует некоторые объекты (используя ASM) при создании отображений для Map объекты. Без этих сгенерированных классов генерация метаданных MOXy не удалась.

Другие вопросы по тегам