Open tangyong opened 11 years ago
Currently, I am investigating publishing rest service from an OSGi bundle using jersey 2.x . A sample1 can be referrenced.
And while putting obr builder module into autostart, there will be the following exception:
[#|2013-02-04T16:45:37.062+0900|INFO|glassfish 4.0|javax.enterprise.logging.stdout|_ThreadID=74;_ThreadName=pool-17-thread-1;_TimeMillis=1359963937062;_LevelValue=800;|ERROR: Bundle org.glassfish.jersey.examples.osgi-http-service.bundle [272] EventDispatcher: Error during dispatch. (java.lang.RuntimeException: javax.servlet.ServletException: javax.servlet.ServletException: [failed to localize] resource.config.unable.to.load(org.glassfish.jersey.examples.osgihttpservice.JerseyApplication))|#]
[#|2013-02-04T16:45:37.078+0900|SEVERE|glassfish
4.0|javax.enterprise.logging.stderr|_ThreadID=74;_ThreadName=pool-17-thread-1;_TimeMillis=1359963937078;_LevelValue=1000;|java.lang.RuntimeException:
javax.servlet.ServletException: javax.servlet.ServletException: [failed
to localize]
resource.config.unable.to.load(org.glassfish.jersey.examples.osgihttpservice.JerseyApplication)
at
org.glassfish.jersey.examples.osgihttpservice.Activator.registerServlets(Activator.java:109)
at
org.glassfish.jersey.examples.osgihttpservice.Activator.access$100(Activator.java:60)
at
org.glassfish.jersey.examples.osgihttpservice.Activator$1.addingService(Activator.java:78)
at
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980)
at
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:906)
at
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262)
at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:234)
at
org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:941)
at
org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932)
at
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
at
org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4260)
at org.apache.felix.framework.Felix.registerService(Felix.java:3275)
at
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
at
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320)
at org.glassfish.osgihttp.Activator.doActualWork(Activator.java:137)
at org.glassfish.osgihttp.Activator.access$300(Activator.java:84)
at
org.glassfish.osgihttp.Activator$OSGiHtttpExtender.start(Activator.java:332)
at
org.glassfish.osgijavaeebase.ExtenderManager$ExtenderTracker.addingService(ExtenderManager.java:144)
at
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980)
at
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:906)
at
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262)
at
org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:185)
at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:348)
at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:283)
at
org.glassfish.osgijavaeebase.ExtenderManager.startExtenders(ExtenderManager.java:109)
at
org.glassfish.osgijavaeebase.ExtenderManager.access$100(ExtenderManager.java:67)
at
org.glassfish.osgijavaeebase.ExtenderManager$GlassFishServerTracker$1.run(ExtenderManager.java:192)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: javax.servlet.ServletException:
javax.servlet.ServletException: [failed to localize]
resource.config.unable.to.load(org.glassfish.jersey.examples.osgihttpservice.JerseyApplication)
at
org.glassfish.osgihttp.GlassFishHttpService.registerServlet(GlassFishHttpService.java:105)
at
org.glassfish.osgihttp.HttpServiceWrapper.registerServlet(HttpServiceWrapper.java:93)
at
org.glassfish.jersey.examples.osgihttpservice.Activator.rawRegisterServlets(Activator.java:119)
at
org.glassfish.jersey.examples.osgihttpservice.Activator.registerServlets(Activator.java:105)
... 33 more
Caused by: javax.servlet.ServletException: [failed to localize]
resource.config.unable.to.load(org.glassfish.jersey.examples.osgihttpservice.JerseyApplication)
at
org.glassfish.jersey.servlet.WebComponent.createResourceConfig(WebComponent.java:378)
at org.glassfish.jersey.servlet.WebComponent.
The issue is caused by classloader and we must set correct thread ContextClassLoader while registering rest servlet.
For example,
ClassLoader oldTCC = Thread.currentThread().getContextClassLoader();
try{
ClassLoader newTCC = new TCCLClassLoader(oldTCC, this.getClass().getClassLoader());
Thread.currentThread().setContextClassLoader(newTCC);
httpService.registerServlet("/jersey-http-service",
new ServletContainer(), getJerseyServletParams(), null);
}finally{
Thread.currentThread().setContextClassLoader(oldTCC);
}
private static class TCCLClassLoader extends ClassLoader { private final ClassLoader oldCLS;
private final ClassLoader newCLS;
public TCCLClassLoader(ClassLoader oldCLS, ClassLoader newCLS) {
this.oldCLS = oldCLS;
this.newCLS = newCLS;
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
Class<?> loadedClass = null;
try {
loadedClass = oldCLS.loadClass(name);
} catch (ClassNotFoundException cnfe) {
loadedClass = newCLS.loadClass(name);
}
return loadedClass;
}
}
In addition, required jersey 2.x dependent bundles are as following:
1 javax.ws.rs-api
2 jersey-server
3 jersey-container-grizzly2-http
4 jersey-container-servlet-core
5 javax.servlet-api
Currently, listsubsystems rest api has been done and passed tests.
A way to implement remote provisioning , and make provisioning apis to support Rest Access from client.
Implementing Priority: P1