Я пытаюсь объединить JAXB (как предусмотрено в dom4j от Hibernate), Hibernate (4.1.3) и Eclipse (4.2).Hibernate, JAXB, Eclipse Plugin
Мой «основной» плагин содержит XMLUserType, который принимает заданное pojo (аннотируется с помощью @XmlRootElement и остальное, из другого подключаемого модуля) и преобразует его в XML и наоборот. Демаршаллизация прекрасно работает с этим кодом (ЦБС класс, как указано в строку с помощью параметра:
public Object fromXMLString(final String xml) {
if (null != xml) {
final ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(cls.getClassLoader());
final JAXBContext jc = JAXBContext.newInstance(cls);
final Unmarshaller unmarshaller = jc.createUnmarshaller();
final StreamSource sr = new StreamSource(new StringReader(xml));
final JAXBElement<?> element = unmarshaller.unmarshal(sr, cls);
return cls.cast(element.getValue());
} catch (final JAXBException e) {
e.printStackTrace();
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
}
return null;
}
/** {@inheritDoc} */
@Override
public void setParameterValues(final Properties parameters) {
final String clsName = (String) parameters.get("ClassType");
try {
this.cls = Thread.currentThread().getContextClassLoader().loadClass(clsName);
} catch (final ClassNotFoundException e) {
e.printStackTrace();
}
}
несчастлив сортировочный только failes и я понятия не имею, почему
public static Document convertToXML(final Object pojo, final Class<?> type) throws SystemException {
Document ret = null;
final ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(type.getClassLoader());
final JAXBContext jc = JAXBContext.newInstance(type);
final Marshaller marshaller = jc.createMarshaller();
final DocumentResult dr = new DocumentResult();
marshaller.marshal(pojo, dr);
final Document document = dr.getDocument();
ret = document;
} catch (final JAXBException e) {
e.printStackTrace();
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
return ret;
}
Это dosnt независимо от того или. . не ClassLoader установлен Он всегда терпит неудачу с этим исключением:
Caused by: com.sun.istack.internal.SAXException2: unable to marshal type
"packagingdetails.PackagingDetails" as an element because it is missing an
@XmlRootElement annotation
Я верю, что причина, либо одна из этих причин: 1. аннотаций представленный прокси и, следовательно, не может быть разрешен 2. КлассLoader создает проблемы ...
Относительно 1 .: Я заметил, что (я попытался использовать это, чтобы получить имя XmlRootElement для создания JAXBElement, но это представляется нецелесообразным ...; мой JAXBType должен оставаться родовым)
final Annotation[] annotations = type.getAnnotations();
XmlRootElement xmlRootElement = null;
for (final Annotation a : annotations) {
if (XmlRootElement.class.isAssignableFrom(a.annotationType())) {
xmlRootElement = (XmlRootElement) a;
break;
}
}
всегда терпит неудачу ...
Кто-нибудь какие-либо идеи ???
Благодаря Matthias