2013-02-25 4 views
2

Я пытаюсь объединить 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

ответ

0

Вы должны быть уверены, что вы импортировать javax.xml.bind пакет или публичный API сверток JAXB в файле META-INF/MANIFEST.MF.

OSGi Пример (Moxy используется в качестве JAXB (JSR-222) провайдера)