REST Json: Johnzon JAX-RS
maggu2810 opened this issue · comments
I would like to use a more recent Johnzon library and the upstream JAX-RS support bundle that provides a message body reader and writer.
I am using the following dependencies:
<dependency>
<groupId>org.apache.johnzon</groupId>
<artifactId>johnzon-core</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>org.apache.johnzon</groupId>
<artifactId>johnzon-jaxrs</artifactId>
<version>1.1.12</version>
</dependency>
<!-- Johnzon Core 1.1.12: Require-Capability: osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)" -->
<dependency>
<groupId>org.apache.aries.spifly</groupId>
<artifactId>org.apache.aries.spifly.dynamic.bundle</artifactId>
<version>1.2.3</version>
</dependency>
<!-- Johnzon Core 1.1.12: Require-Capability: osgi.contract;osgi.contract=JavaJSONP;filter:="(&(osgi.contract=JavaJSONP)(version=1.1.0))" -->
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-json_1.1_spec</artifactId>
<version>1.2</version>
</dependency>
and dropped the org.osgi.enroute.examples.microservice.restJsonpConvertingPlugin
file.
My assumption has been that classes org.apache.johnzon.jaxrs.JohnzonMessageBodyReader
and org.apache.johnzon.jaxrs.JohnzonMessageBodyWriter
will be used automatically.
But it does not work.
Could you help?
I created a component that looks like:
@Component(scope = PROTOTYPE, service = { MessageBodyReader.class })
@JaxrsExtension
@JaxrsMediaType(APPLICATION_JSON)
public class JsonpReader<T> extends JohnzonMessageBodyReader<T> {
}
But I got an activation error for that component:
12:33:22.607 [main] ERROR e.a.e.d.m.rest.impl.JsonpReader:72 - bundle tmp.bundles.metainfo-rest:1.0.0.201908021033 (6)[tmp.db.metainfo.rest.impl.JsonpReader(4)] : Error during instantiation of the implementation object
java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.felix.scr.impl.inject.ComponentConstructor.newInstance(ComponentConstructor.java:309)
at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:277)
at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:114)
at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:982)
at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:955)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:765)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:666)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:432)
at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:665)
at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:338)
at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:382)
at org.apache.felix.scr.impl.Activator.access$200(Activator.java:49)
at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:264)
at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196)
at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169)
at org.apache.felix.scr.impl.AbstractExtender.addingBundle(AbstractExtender.java:139)
at org.apache.felix.scr.impl.AbstractExtender.addingBundle(AbstractExtender.java:49)
at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:475)
at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:1)
at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)
at org.osgi.util.tracker.BundleTracker.open(BundleTracker.java:159)
at org.apache.felix.scr.impl.AbstractExtender.startTracking(AbstractExtender.java:100)
at org.apache.felix.scr.impl.AbstractExtender.doStart(AbstractExtender.java:92)
at org.apache.felix.scr.impl.Activator.doStart(Activator.java:172)
at org.apache.felix.scr.impl.AbstractExtender.start(AbstractExtender.java:72)
at org.apache.felix.scr.impl.Activator.restart(Activator.java:139)
at org.apache.felix.scr.impl.config.ScrConfigurationImpl.configure(ScrConfigurationImpl.java:217)
at org.apache.felix.scr.impl.config.ScrConfigurationImpl.start(ScrConfigurationImpl.java:120)
at org.apache.felix.scr.impl.Activator.start(Activator.java:100)
at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:842)
at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:834)
at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:791)
at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1013)
at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:365)
at org.eclipse.osgi.container.Module.doStart(Module.java:598)
at org.eclipse.osgi.container.Module.start(Module.java:462)
at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:439)
at aQute.launcher.Launcher.startBundles(Launcher.java:528)
at aQute.launcher.Launcher.activate(Launcher.java:427)
at aQute.launcher.Launcher.run(Launcher.java:306)
at aQute.launcher.Launcher.main(Launcher.java:152)
Caused by: javax.json.JsonException: org.apache.johnzon.core.JsonProviderImpl not found
at javax.json.spi.JsonProvider.doLoadProvider(JsonProvider.java:118)
at javax.json.spi.JsonProvider.provider(JsonProvider.java:89)
at org.apache.johnzon.mapper.MapperBuilder.build(MapperBuilder.java:153)
at org.apache.johnzon.jaxrs.JohnzonMessageBodyReader.<init>(JohnzonMessageBodyReader.java:49)
at tmp.db.metainfo.rest.impl.JsonpReader.<init>(JsonpReader.java:15)
... 48 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.apache.johnzon.core.JsonProviderImpl
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.eclipse.osgi.internal.framework.ContextFinder.loadClass(ContextFinder.java:139)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at javax.json.spi.JsonProvider.doLoadProvider(JsonProvider.java:116)
... 52 common frames omitted
It works using that two classes:
@Component(scope = PROTOTYPE, service = { MessageBodyReader.class })
@JaxrsExtension
@JaxrsMediaType(APPLICATION_JSON)
public class JsonpReader<T> extends JohnzonMessageBodyReader<T> {
public JsonpReader() {
super(new MapperBuilder().setProvider(new JsonProviderImpl()).setDoCloseOnStreams(false).build(), null);
}
}
@Component(scope = PROTOTYPE, service = { MessageBodyWriter.class })
@JaxrsExtension
@JaxrsMediaType(APPLICATION_JSON)
public class JsonpWriter<T> extends JohnzonMessageBodyWriter<T> {
public JsonpWriter() {
super(new MapperBuilder().setProvider(new JsonProviderImpl()).setDoCloseOnStreams(false).build(), null);
}
}
But wouldn't it make sense to add the JAX-RS whitepattern support to the Johnzon JAX-RS bundle itself?
But wouldn't it make sense to add the JAX-RS whitepattern support to the Johnzon JAX-RS bundle itself?
The example that you're following is intended to be exactly that, an example not production code. We use Johnzon as an example of how you might use the JAX-RS whiteboard. Obviously for production use it would be better for the Johnzon team to provide this support as part of the library, but it wouldn't be such a good example of how to provide extensions to the JAX-RS whiteboard!
It seems as though you've more or less resolved your own problem. Please feel free to reopen this bug with more details if you're still having issues.