Hello,

There seems to be an issue with the Jackson JSON processing.

>From a clean karaf 4.4.6 install I do:

feature:install scr
feature:repo-add aries.jax.rs.whiteboard
feature:repo-add cxf
feature:install aries-jax-rs-whiteboard-jackson

I then deploy a simple bundle:

@Component(service = TestResource.class, scope = ServiceScope.PROTOTYPE)
@JaxrsResource
//@JaxrsApplicationSelect("(" + JaxrsWhiteboardConstants.JAX_RS_NAME + "=" + 
MyApplication.NAME + ")")
public class TestResource {

  @GET
  @Path("hello")
  @Produces(MediaType.APPLICATION_JSON)
  public Woot sayHello(){
    return new Woot();
  }

  @GET
  @Path("hello2")
  @Produces(MediaType.TEXT_PLAIN)
  public String sayHello2(){
    return "test\n";
  }
}

curl localhost:8181/hello2 returns 'test'

the second curl should return the json of Woot which is just a simple
class with a getName(), however, the first invocation will return the
following. The second invocation does what is expected.

Caused by: java.lang.ClassNotFoundException: 
com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found by 
com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider [62]
        at 
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1591)
 ~[?:?]
        at 
org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:79)
 ~[?:?]
        at 
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1976)
 ~[?:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[?:?]
        at 
com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator._resolveIntrospector(JsonMapperConfigurator.java:126)
 ~[?:?]
        at 
com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator._resolveIntrospectors(JsonMapperConfigurator.java:101)
 ~[?:?]
        at 
com.fasterxml.jackson.jaxrs.cfg.MapperConfiguratorBase._setAnnotations(MapperConfiguratorBase.java:120)
 ~[?:?]
        at 
com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator.getDefaultMapper(JsonMapperConfigurator.java:51)
 ~[?:?]
        at 
com.fasterxml.jackson.jaxrs.base.ProviderBase.locateMapper(ProviderBase.java:925)
 ~[?:?]
        at 
com.fasterxml.jackson.jaxrs.base.ProviderBase._endpointForWriting(ProviderBase.java:697)
 ~[?:?]
        at 
com.fasterxml.jackson.jaxrs.base.ProviderBase.writeTo(ProviderBase.java:572) 
~[?:?]
        at 
org.apache.cxf.jaxrs.utils.JAXRSUtils.writeMessageBody(JAXRSUtils.java:1651) 
~[!/:3.6.4]
        at 
org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:249)
 ~[!/:3.6.4]

This assumes using the default whiteboard. If I create an application
and set the following:

@Component(service = Application.class, property = { 
"servlet.init.hide-service-list-page=false" })
@JaxrsName(MyApplication.NAME)
@JaxrsApplicationBase("/test")
public class MyApplication extends Application {

  public static final String NAME = "my-app";
}

And then I uncomment the JaxRsApplicationSelect, it will report there
are no message body writers at all. I had assumed that bringing in the
aries-jax-rs-whiteboard-jackson feature would register the provider to
all contexts. It seems only to work with the default context but only
after the first invocation fails.

A side note when deploying multiple applications I have to set the 

org.apache.cxf.osgi.http.transport.disable=true

This is neither here nor there I just found it on a forum. I think there
should be more examples.

I have also noticed that bringing in that aries whiteboard jackson
relies on cxf-jaxrs which brings in different versions of the jackson
libraries. Perhaps this should be removed.

Any ideas how to resolve this for the case of the default whiteboard and
registering the provider when not deployed to the default using
Application?

-- 
Chaz

Reply via email to