Camel/CXF REST-ful JSON Serialization Issue

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Camel/CXF REST-ful JSON Serialization Issue

John Dubchak
Hi,

The more I think about it, this is likely a CXF question not a Camel
question. However, I am not a member of the CXF list and I suspect when
I say I am using the CXF version in Camel 2.12.3, I would end up here.
Apologies if I should not have posted here.

That being said, I have created several blueprint REST services that
respond with JSON using the default JSONProvider. I noticed one
response, a single item list, was not serialized as an array. Googling
this led me down the path of trying to configure the JSONProvider
directly which didn't work and several search results suggested that the
bug was already fixed back in 2009 in Jettison, but my results appear
different.

Here's what I have configured in my blueprint.xml:

<cxf:bus>
     <cxf:features>
         <cxf:logging/>
     </cxf:features>
</cxf:bus>

<bean id="jsonProvider"
class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
     <property name="serializeAsArray" value="true"/>
     <property name="arrayKeys">
         <list>
             <value>steps</value>
         </list>
     </property>
</bean>

<!-- Exported REST Services -->
<jaxrs:server address="/cdw/services/api/v2" id="servicesBeans">
     <jaxrs:serviceBeans>
         ... (services)
     </jaxrs:serviceBeans>

     <jaxrs:providers>
         <ref bean="jsonProvider"/>
     </jaxrs:providers>

</jaxrs:server>

This produces the following error:

org.osgi.service.blueprint.container.ComponentDefinitionException:
Element ref must have a valid component-id attribute
        at org.apache.aries.blueprint.parser.Parser.parseRef(Parser.java:1217)
        at
org.apache.aries.blueprint.parser.Parser.parseValueGroup(Parser.java:1183)
        at
org.apache.aries.blueprint.parser.Parser.parseCollection(Parser.java:740)
        at org.apache.aries.blueprint.parser.Parser.parseElement(Parser.java:363)
        at
org.apache.aries.blueprint.parser.ParserContextImpl.parseElement(ParserContextImpl.java:69)
        at
org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser.parseListData(AbstractBPBeanDefinitionParser.java:84)
        at
org.apache.cxf.jaxrs.blueprint.JAXRSServerFactoryBeanDefinitionParser.mapElement(JAXRSServerFactoryBeanDefinitionParser.java:99)
        at
org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser.parseChildElements(AbstractBPBeanDefinitionParser.java:307)
        at
org.apache.cxf.configuration.blueprint.SimpleBPBeanDefinitionParser.parse(SimpleBPBeanDefinitionParser.java:61)
        at
org.apache.cxf.jaxrs.blueprint.JAXRSServerFactoryBeanDefinitionParser.parse(JAXRSServerFactoryBeanDefinitionParser.java:133)
        at
org.apache.cxf.jaxrs.blueprint.JAXRSBPNamespaceHandler.parse(JAXRSBPNamespaceHandler.java:51)
        at
org.apache.aries.blueprint.parser.Parser.parseCustomElement(Parser.java:1279)
        at org.apache.aries.blueprint.parser.Parser.loadComponents(Parser.java:337)
        at org.apache.aries.blueprint.parser.Parser.populate(Parser.java:277)

What is the correct way, using ServiceMix (5.0.0), Camel 2.12.3 and the
CXF version that is included in the Camel distribution, to configure the
JSONProvider to produce JSON of a single item list as an array?

I appreciate any input.

Thanks,
John

Reply | Threaded
Open this post in threaded view
|

Re: Camel/CXF REST-ful JSON Serialization Issue

Sergey Beryozkin
This is a CXF question after all, why would you not ask at CXF users :-) ?
This appears to be a blueprint specific issue, use "<ref
component-id="jsonProvider"/>"

Cheers, Sergey
On 11/06/14 18:23, John Dubchak wrote:

> Hi,
>
> The more I think about it, this is likely a CXF question not a Camel
> question. However, I am not a member of the CXF list and I suspect when
> I say I am using the CXF version in Camel 2.12.3, I would end up here.
> Apologies if I should not have posted here.
>
> That being said, I have created several blueprint REST services that
> respond with JSON using the default JSONProvider. I noticed one
> response, a single item list, was not serialized as an array. Googling
> this led me down the path of trying to configure the JSONProvider
> directly which didn't work and several search results suggested that the
> bug was already fixed back in 2009 in Jettison, but my results appear
> different.
>
> Here's what I have configured in my blueprint.xml:
>
> <cxf:bus>
>      <cxf:features>
>          <cxf:logging/>
>      </cxf:features>
> </cxf:bus>
>
> <bean id="jsonProvider"
> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>      <property name="serializeAsArray" value="true"/>
>      <property name="arrayKeys">
>          <list>
>              <value>steps</value>
>          </list>
>      </property>
> </bean>
>
> <!-- Exported REST Services -->
> <jaxrs:server address="/cdw/services/api/v2" id="servicesBeans">
>      <jaxrs:serviceBeans>
>          ... (services)
>      </jaxrs:serviceBeans>
>
>      <jaxrs:providers>
>          <ref bean="jsonProvider"/>
>      </jaxrs:providers>
>
> </jaxrs:server>
>
> This produces the following error:
>
> org.osgi.service.blueprint.container.ComponentDefinitionException:
> Element ref must have a valid component-id attribute
>      at org.apache.aries.blueprint.parser.Parser.parseRef(Parser.java:1217)
>      at
> org.apache.aries.blueprint.parser.Parser.parseValueGroup(Parser.java:1183)
>      at
> org.apache.aries.blueprint.parser.Parser.parseCollection(Parser.java:740)
>      at
> org.apache.aries.blueprint.parser.Parser.parseElement(Parser.java:363)
>      at
> org.apache.aries.blueprint.parser.ParserContextImpl.parseElement(ParserContextImpl.java:69)
>
>      at
> org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser.parseListData(AbstractBPBeanDefinitionParser.java:84)
>
>      at
> org.apache.cxf.jaxrs.blueprint.JAXRSServerFactoryBeanDefinitionParser.mapElement(JAXRSServerFactoryBeanDefinitionParser.java:99)
>
>      at
> org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser.parseChildElements(AbstractBPBeanDefinitionParser.java:307)
>
>      at
> org.apache.cxf.configuration.blueprint.SimpleBPBeanDefinitionParser.parse(SimpleBPBeanDefinitionParser.java:61)
>
>      at
> org.apache.cxf.jaxrs.blueprint.JAXRSServerFactoryBeanDefinitionParser.parse(JAXRSServerFactoryBeanDefinitionParser.java:133)
>
>      at
> org.apache.cxf.jaxrs.blueprint.JAXRSBPNamespaceHandler.parse(JAXRSBPNamespaceHandler.java:51)
>
>      at
> org.apache.aries.blueprint.parser.Parser.parseCustomElement(Parser.java:1279)
>
>      at
> org.apache.aries.blueprint.parser.Parser.loadComponents(Parser.java:337)
>      at org.apache.aries.blueprint.parser.Parser.populate(Parser.java:277)
>
> What is the correct way, using ServiceMix (5.0.0), Camel 2.12.3 and the
> CXF version that is included in the Camel distribution, to configure the
> JSONProvider to produce JSON of a single item list as an array?
>
> I appreciate any input.
>
> Thanks,
> John
>
Reply | Threaded
Open this post in threaded view
|

Re: Camel/CXF REST-ful JSON Serialization Issue

John Dubchak
Sergey,

Thanks for the laugh and the help - both were sorely needed.

John

On 6/11/14 1:10 PM, Sergey Beryozkin wrote:

> This is a CXF question after all, why would you not ask at CXF users :-) ?
> This appears to be a blueprint specific issue, use "<ref
> component-id="jsonProvider"/>"
>
> Cheers, Sergey
> On 11/06/14 18:23, John Dubchak wrote:
>> Hi,
>>
>> The more I think about it, this is likely a CXF question not a Camel
>> question. However, I am not a member of the CXF list and I suspect when
>> I say I am using the CXF version in Camel 2.12.3, I would end up here.
>> Apologies if I should not have posted here.
>>
>> That being said, I have created several blueprint REST services that
>> respond with JSON using the default JSONProvider. I noticed one
>> response, a single item list, was not serialized as an array. Googling
>> this led me down the path of trying to configure the JSONProvider
>> directly which didn't work and several search results suggested that the
>> bug was already fixed back in 2009 in Jettison, but my results appear
>> different.
>>
>> Here's what I have configured in my blueprint.xml:
>>
>> <cxf:bus>
>>      <cxf:features>
>>          <cxf:logging/>
>>      </cxf:features>
>> </cxf:bus>
>>
>> <bean id="jsonProvider"
>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>>      <property name="serializeAsArray" value="true"/>
>>      <property name="arrayKeys">
>>          <list>
>>              <value>steps</value>
>>          </list>
>>      </property>
>> </bean>
>>
>> <!-- Exported REST Services -->
>> <jaxrs:server address="/cdw/services/api/v2" id="servicesBeans">
>>      <jaxrs:serviceBeans>
>>          ... (services)
>>      </jaxrs:serviceBeans>
>>
>>      <jaxrs:providers>
>>          <ref bean="jsonProvider"/>
>>      </jaxrs:providers>
>>
>> </jaxrs:server>
>>
>> This produces the following error:
>>
>> org.osgi.service.blueprint.container.ComponentDefinitionException:
>> Element ref must have a valid component-id attribute
>>      at
>> org.apache.aries.blueprint.parser.Parser.parseRef(Parser.java:1217)
>>      at
>> org.apache.aries.blueprint.parser.Parser.parseValueGroup(Parser.java:1183)
>>
>>      at
>> org.apache.aries.blueprint.parser.Parser.parseCollection(Parser.java:740)
>>      at
>> org.apache.aries.blueprint.parser.Parser.parseElement(Parser.java:363)
>>      at
>> org.apache.aries.blueprint.parser.ParserContextImpl.parseElement(ParserContextImpl.java:69)
>>
>>
>>      at
>> org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser.parseListData(AbstractBPBeanDefinitionParser.java:84)
>>
>>
>>      at
>> org.apache.cxf.jaxrs.blueprint.JAXRSServerFactoryBeanDefinitionParser.mapElement(JAXRSServerFactoryBeanDefinitionParser.java:99)
>>
>>
>>      at
>> org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser.parseChildElements(AbstractBPBeanDefinitionParser.java:307)
>>
>>
>>      at
>> org.apache.cxf.configuration.blueprint.SimpleBPBeanDefinitionParser.parse(SimpleBPBeanDefinitionParser.java:61)
>>
>>
>>      at
>> org.apache.cxf.jaxrs.blueprint.JAXRSServerFactoryBeanDefinitionParser.parse(JAXRSServerFactoryBeanDefinitionParser.java:133)
>>
>>
>>      at
>> org.apache.cxf.jaxrs.blueprint.JAXRSBPNamespaceHandler.parse(JAXRSBPNamespaceHandler.java:51)
>>
>>
>>      at
>> org.apache.aries.blueprint.parser.Parser.parseCustomElement(Parser.java:1279)
>>
>>
>>      at
>> org.apache.aries.blueprint.parser.Parser.loadComponents(Parser.java:337)
>>      at
>> org.apache.aries.blueprint.parser.Parser.populate(Parser.java:277)
>>
>> What is the correct way, using ServiceMix (5.0.0), Camel 2.12.3 and the
>> CXF version that is included in the Camel distribution, to configure the
>> JSONProvider to produce JSON of a single item list as an array?
>>
>> I appreciate any input.
>>
>> Thanks,
>> John
>>