Использование реализации 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 не удалась.