I have solved this problem by adding file: 

        /META-INF/services/org/apache/camel/dataformat/JacksonDFWithDynamicViews

With content:

        class=org.xx.JacksonDFWithDynamicViews

Camel will find and register the Data Schema, but there is a caveat. The bundle 
needs to have visibility of package “org.apache.camel.spi”. Found this by 
looking in Camel “org.apache.camel.impl.osgi.Activator” class, which has this:


 protected void registerDataFormats(Bundle bundle, List<BaseService> resolvers) 
{
        if (canSee(bundle, DataFormat.class)) {

In my case, it was not working, because my custom Data Format is extending 
JacksonDataFormat, the bundle did not import package “org.apache.camel.spi”, so 
Camel was ignoring it.  Forcing the bundle to import “org.apache.camel.spi”. 
Since I am using BND, I added:

Import-Package: \
        org.apache.camel.spi, \
        *

And now the Data Format is properly registered.



Best regards,
Alex soto




> On Mar 12, 2019, at 10:44 AM, Alex Soto <alex.s...@envieta.com> wrote:
> 
> Hello,
> 
> I am trying to use a custom Data Format with Camel Rest DSL in an OSGi 
> container (Karaf) but the bundle fails to initialize with error:
> 
> 
> Bundle XXXX is waiting for dependencies 
> [(&(dataformat=JacksonDFWithDynamicViews)(objectClass=org.apache.camel.spi.DataFormatResolver))]
> 
> 
> I am instantiating the data format class as a Blueprint bean:
> 
> 
>     <bean id="jacksonDF" class="org.xx.JacksonDFWithDynamicViews"/>
> 
> 
> Then, in my Camel Context I register the custom data format:
> 
>       <dataFormats>
>           <custom ref="jacksonDF" id="JacksonDFWithDynamicViews"/>
>       </dataFormats>
> 
> Which I then reference in the Rest DSL configuration:
> 
> <restConfiguration 
>       component="servlet"
>       bindingMode="json"
>       jsonDataFormat="JacksonDFWithDynamicViews"
>       contextPath="{{context.path}}{{api.root.path}}" 
>       port="{{port}}"
>       enableCORS="false">
> 
> 
> 
> Any idea of what is going on here?
> 
> Best regards,
> Alex soto
> 
> 
> 
> 

Reply via email to