osgi / osgi.enroute

The OSGi enRoute project provides a programming model of OSGi applications. This project contains bundles providing the API for the OSGi enRoute base profile and bundles for the OSGi enRoute project. The base profile establishes a runtime that contains a minimal set of services that can be used as a base for applications.

Home Page:https://enroute.osgi.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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.