users@glassfish.java.net

Re: JAXB in Glassfish

From: Sanjeeb Sahoo <Sahoo_at_Sun.COM>
Date: Fri, 04 Jun 2010 22:56:12 +0530

Larry,

I have actually filed a bug for this. See [1]. Vote for it please. I
don't know if there is any better way to solve it, but I faced it for
one of my GlassFish extension bundles and I worked around it like this:

     import org.glassfish.internal.api.Globals;
     import org.glassfish.internal.api.ClassLoaderHierarchy;

     ...

     private JAXBContext getJAXBContext() throws JAXBException {
         // We need to set context class loader to be CommonClassLoader,
otherwise our stupid JAXB implementation
         // won't be able to locate the default JAXB context factory class.
         final Thread thread = Thread.currentThread();
         ClassLoader oldCL = thread.getContextClassLoader();
         try {
             ClassLoader ccl =
Globals.get(ClassLoaderHierarchy.class).getCommonClassLoader();
             thread.setContextClassLoader(ccl);
             JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
         return jc;
         } finally {
             thread.setContextClassLoader(oldCL);
         }
     }

You will have to add the following dependency to compile though:

<dependency>
<groupId>org.glassfish.common</groupId>
<artifactId>internal-api</artifactId>
<version>${project.version}</version>
</dependency>

I don't think you can apply this work around in your code - it has too
much dependency on glassfish internals.

Thanks,
Sahoo

[1] https://glassfish.dev.java.net/issues/show_bug.cgi?id=11748

On Friday 04 June 2010 10:08 PM, Larry Touve wrote:
>
> Has anyone had success in using JAXB to marshal/unmarshall stuff in
> Glassfish? I'm using Glassfish V3.1-SNAPSHOT, and I'm running into
> tons of problems getting it to work from inside my bundles. I know it
> can work, because at one point in time I had deployed some combination
> of bundles that allowed it to work, but I can't get back to that state.
>
> When I try to call JAXBContext.newInstance(<package-name>) I either get:
>
> java.lang.RuntimeException: javax.xml.bind.JAXBException:
>
> <package-name> doesn't contain ObjectFactory.class or jaxb.index
>
> Or if I pass newInstance() a ClassLoader, I get:
>
> javax.xml.bind.JAXBException: Provider
> com.sun.xml.internal.bind.v2.ContextFactory not found - with linked
> exception:
>
> [java.lang.ClassNotFoundException:
> com.sun.xml.internal.bind.v2.ContextFactory]
>
> at
> javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146)
>
> at
> javax.xml.bind.ContextFinder.find(ContextFinder.java:289)
>
> at
> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:412)
>
> at
> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:375)
>
> at
> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:279)
>
> at Utils.unMarshall(Utils.java:215)
>
> at
> osgi.controller.JCMSController.publish(JCMSController.java:245)
>
> at
> osgi.controller.JCMSController.publishTrigger(JCMSController.java:320)
>
> at osgi.hscb.TcpThread.run(TcpThread.java:107)
>
> at java.lang.Thread.run(Thread.java:619)
>
> Caused by: java.lang.ClassNotFoundException:
> com.sun.xml.internal.bind.v2.ContextFactory
>
> at
> org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:744)
>
> at
> org.apache.felix.framework.ModuleImpl.access$100(ModuleImpl.java:61)
>
> at
> org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1656)
>
> at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>
> at
> org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:604)
>
> at
> org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1487)
>
> at
> org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:897)
>
> at
> org.ops4j.pax.swissbox.core.BundleClassLoader.findClass(BundleClassLoader.java:176)
>
> at
> org.ops4j.pax.swissbox.core.BundleClassLoader.loadClass(BundleClassLoader.java:194)
>
> at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>
> at
> javax.xml.bind.ContextFinder.safeLoadClass(ContextFinder.java:480)
>
> at
> javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:112)
>
> ... 9 more
>
> Glassfish uses version 2.2 of jaxb-api, and I've event tried using the
> DynamicJava version of JAXB (2.1).
>
> Thanks,
>
> Larry
>