Hibernate、JAXB、Eclipse插件

Hibernate、JAXB、Eclipse插件,hibernate,eclipse-plugin,jaxb,eclipse-rcp,Hibernate,Eclipse Plugin,Jaxb,Eclipse Rcp,我正在尝试将JAXB(由Hibernate在dom4j中提供)、Hibernate(4.1.3)和Eclipse(4.2)插件结合起来 我的“核心”插件包含一个XMLUserType,它接受一个给定的pojo(用@XmlRootElement和其他注释;来自另一个插件)并将其转换为XML,反之亦然。解组可以很好地处理这段代码(cls是通过参数按字符串给定的类: public Object fromXMLString(final String xml) { if (null != xml)

我正在尝试将JAXB(由Hibernate在dom4j中提供)、Hibernate(4.1.3)和Eclipse(4.2)插件结合起来

我的“核心”插件包含一个XMLUserType,它接受一个给定的pojo(用@XmlRootElement和其他注释;来自另一个插件)并将其转换为XML,反之亦然。解组可以很好地处理这段代码(cls是通过参数按字符串给定的类:

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();
    }
}
我相信原因是以下原因之一: 1.注释由代理表示,因此无法解析 2.类加载器制造麻烦

关于1:我注意到(我试图用它来获取XmlRootElement的名称来创建一个JAXBElement,但这似乎不可行……;我的JAXBType应该保持通用)

总是失败

有人有什么想法吗

谢谢
Matthias

您需要确保在
META-INF/MANIFEST.MF
文件中导入
javax.xml.bind
包或JAXB公共API包

OSGi示例(MOXy用作JAXB(JSR-222)提供程序)

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;
}
Caused by: com.sun.istack.internal.SAXException2: unable to marshal type 
"packagingdetails.PackagingDetails" as an element because it is missing an 
@XmlRootElement annotation
final Annotation[] annotations = type.getAnnotations();
XmlRootElement xmlRootElement = null;
for (final Annotation a : annotations) {
    if (XmlRootElement.class.isAssignableFrom(a.annotationType())) {
        xmlRootElement = (XmlRootElement) a;
        break;
    }
}