You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by shedloadsofbeer <Pa...@gossinteractive.com> on 2008/11/19 15:42:08 UTC

MessageBodyReader implementation problem

I am trying to convert json data into one for our object types required by a
webservice.

I have not started with the json conversion yet, I just wanted the framework
in place and ensure that the provider class gets called. But it isn't, so
the service just has the parameter 'queryNodeData' set to null.

I can't see what I am doing wrong.

service snippet:
    @GET
    @Path("search")
    @ConsumeMime("application/json")
    @ProduceMime("application/json")
    public NodeDataMessage search(@QueryParam("querynodedata") final
NodeData queryNodeData) {
    }

beans.xml snippet:
	<jaxrs:server id="documentServiceRest" address="/rest">
		<jaxrs:serviceBeans>
			<ref bean="documentServicesFacadeBean" />
		</jaxrs:serviceBeans>
		<jaxrs:providers>
			<ref bean="nodeDataProviderBean" />
		</jaxrs:providers>
	</jaxrs:server>
	<bean id="nodeDataProviderBean" class="foo.bar.NodeDataProvider" />

provider class:
  package foo.bar
  import ...
  public class NodeDataProvider implements MessageBodyReader<NodeData> {
    public boolean isReadable(Class<?> type, Type genericType, Annotation[]
annotations) {
        return NodeData.class.isAssignableFrom(type);
    }
    public NodeData readFrom(Class<NodeData> arg0, Type arg1, Annotation[]
arg2, MediaType arg3,
            MultivaluedMap<String, String> arg4, InputStream arg5) throws
IOException,
            WebApplicationException {
        return new NodeData();
    }
}

-- 
View this message in context: http://www.nabble.com/MessageBodyReader-implementation-problem-tp20581190p20581190.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: MessageBodyReader implementation problem

Posted by Sergey Beryozkin <se...@progress.com>.
Hi

>
> Hi Sergey,
>
> Does this mean that MessageBodyReaders are only invoked for JAXWS
> annotations?

They're not used when JAXWS is involved at all, but on only on the JAXRS path in cases like this one :

@POST
void foo(NodeData data)

or

@POST
void foo(@PostParam("a") String a, @QueryParam("b") String b, NodeData data)

That is when a request body is available (as opposed to URI/Query ones) and there's only one non-JAXRS annotated parameter is there.

Mapping a JAXRS request to a method like this one :

void foo(String b, NodeData data)

is problematic - we might introduce a custom extension - but I'm not really sure it will be worth it, as having multiple parameters 
to be unwrapped from a request body in a web service method is problematic on its own anyway

Cheers, Sergey

>
>
>
> Sergey Beryozkin-3 wrote:
>>
>> Hi
>>
>>>
>>> I am trying to convert json data into one for our object types required
>>> by a
>>> webservice.
>>>
>>> I have not started with the json conversion yet, I just wanted the
>>> framework
>>> in place and ensure that the provider class gets called. But it isn't, so
>>> the service just has the parameter 'queryNodeData' set to null.
>>>
>>> I can't see what I am doing wrong.
>>>
>>> service snippet:
>>>    @GET
>>>    @Path("search")
>>>    @ConsumeMime("application/json")
>>>    @ProduceMime("application/json")
>>>    public NodeDataMessage search(@QueryParam("querynodedata") final
>>> NodeData queryNodeData) {
>>>    }
>>
>> MessageBodyReades are not invoked for parameters annotated with
>> @QueryParam or indeed with other
>> JAXRS annotations.
>>
>> suppose you GET request looks like this :
>>
>> /search?q1=a&q2=b
>>
>> If you do not want to do
>>
>> public NodeDataMessage search(@QueryParam("q1") String q1,
>> @QueryParam("q2") String q2)
>>
>> then you can rely on a CXF extension (note "" as a queryparam value) :
>>
>> public NodeDataMessage search((@QueryParam("") final NodeData
>> queryNodeData)
>>
>> with NodeData having setQ1 and setQ2 methods
>>
>> Another aproacj is to have UriInfo injected as a context value and access
>> query parameters from it
>>
>> Cheers, Sergey
>>
>>>
>>> beans.xml snippet:
>>> <jaxrs:server id="documentServiceRest" address="/rest">
>>> <jaxrs:serviceBeans>
>>> <ref bean="documentServicesFacadeBean" />
>>> </jaxrs:serviceBeans>
>>> <jaxrs:providers>
>>> <ref bean="nodeDataProviderBean" />
>>> </jaxrs:providers>
>>> </jaxrs:server>
>>> <bean id="nodeDataProviderBean" class="foo.bar.NodeDataProvider" />
>>>
>>> provider class:
>>>  package foo.bar
>>>  import ...
>>>  public class NodeDataProvider implements MessageBodyReader<NodeData> {
>>>    public boolean isReadable(Class<?> type, Type genericType,
>>> Annotation[]
>>> annotations) {
>>>        return NodeData.class.isAssignableFrom(type);
>>>    }
>>>    public NodeData readFrom(Class<NodeData> arg0, Type arg1, Annotation[]
>>> arg2, MediaType arg3,
>>>            MultivaluedMap<String, String> arg4, InputStream arg5) throws
>>> IOException,
>>>            WebApplicationException {
>>>        return new NodeData();
>>>    }
>>> }
>>>
>>> -- 
>>> View this message in context:
>>> http://www.nabble.com/MessageBodyReader-implementation-problem-tp20581190p20581190.html
>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>
>>>
>>
>>
>>
>
> -- 
> View this message in context: http://www.nabble.com/MessageBodyReader-implementation-problem-tp20581190p20582576.html
> Sent from the cxf-user mailing list archive at Nabble.com.
>
> 



Re: MessageBodyReader implementation problem

Posted by shedloadsofbeer <Pa...@gossinteractive.com>.
Hi Sergey,

Does this mean that MessageBodyReaders are only invoked for JAXWS
annotations?



Sergey Beryozkin-3 wrote:
> 
> Hi
> 
>> 
>> I am trying to convert json data into one for our object types required
>> by a
>> webservice.
>> 
>> I have not started with the json conversion yet, I just wanted the
>> framework
>> in place and ensure that the provider class gets called. But it isn't, so
>> the service just has the parameter 'queryNodeData' set to null.
>> 
>> I can't see what I am doing wrong.
>> 
>> service snippet:
>>    @GET
>>    @Path("search")
>>    @ConsumeMime("application/json")
>>    @ProduceMime("application/json")
>>    public NodeDataMessage search(@QueryParam("querynodedata") final
>> NodeData queryNodeData) {
>>    }
> 
> MessageBodyReades are not invoked for parameters annotated with
> @QueryParam or indeed with other
> JAXRS annotations.
> 
> suppose you GET request looks like this :
> 
> /search?q1=a&q2=b
> 
> If you do not want to do
> 
> public NodeDataMessage search(@QueryParam("q1") String q1,
> @QueryParam("q2") String q2) 
> 
> then you can rely on a CXF extension (note "" as a queryparam value) :
> 
> public NodeDataMessage search((@QueryParam("") final NodeData
> queryNodeData) 
> 
> with NodeData having setQ1 and setQ2 methods 
> 
> Another aproacj is to have UriInfo injected as a context value and access
> query parameters from it
> 
> Cheers, Sergey
> 
>> 
>> beans.xml snippet:
>> <jaxrs:server id="documentServiceRest" address="/rest">
>> <jaxrs:serviceBeans>
>> <ref bean="documentServicesFacadeBean" />
>> </jaxrs:serviceBeans>
>> <jaxrs:providers>
>> <ref bean="nodeDataProviderBean" />
>> </jaxrs:providers>
>> </jaxrs:server>
>> <bean id="nodeDataProviderBean" class="foo.bar.NodeDataProvider" />
>> 
>> provider class:
>>  package foo.bar
>>  import ...
>>  public class NodeDataProvider implements MessageBodyReader<NodeData> {
>>    public boolean isReadable(Class<?> type, Type genericType,
>> Annotation[]
>> annotations) {
>>        return NodeData.class.isAssignableFrom(type);
>>    }
>>    public NodeData readFrom(Class<NodeData> arg0, Type arg1, Annotation[]
>> arg2, MediaType arg3,
>>            MultivaluedMap<String, String> arg4, InputStream arg5) throws
>> IOException,
>>            WebApplicationException {
>>        return new NodeData();
>>    }
>> }
>> 
>> -- 
>> View this message in context:
>> http://www.nabble.com/MessageBodyReader-implementation-problem-tp20581190p20581190.html
>> Sent from the cxf-user mailing list archive at Nabble.com.
>> 
>>
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/MessageBodyReader-implementation-problem-tp20581190p20582576.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: MessageBodyReader implementation problem

Posted by Sergey Beryozkin <se...@progress.com>.
Hi

> 
> I am trying to convert json data into one for our object types required by a
> webservice.
> 
> I have not started with the json conversion yet, I just wanted the framework
> in place and ensure that the provider class gets called. But it isn't, so
> the service just has the parameter 'queryNodeData' set to null.
> 
> I can't see what I am doing wrong.
> 
> service snippet:
>    @GET
>    @Path("search")
>    @ConsumeMime("application/json")
>    @ProduceMime("application/json")
>    public NodeDataMessage search(@QueryParam("querynodedata") final
> NodeData queryNodeData) {
>    }

MessageBodyReades are not invoked for parameters annotated with @QueryParam or indeed with other
JAXRS annotations.

suppose you GET request looks like this :

/search?q1=a&q2=b

If you do not want to do

public NodeDataMessage search(@QueryParam("q1") String q1, @QueryParam("q2") String q2) 

then you can rely on a CXF extension (note "" as a queryparam value) :

public NodeDataMessage search((@QueryParam("") final NodeData queryNodeData) 

with NodeData having setQ1 and setQ2 methods 

Another aproacj is to have UriInfo injected as a context value and access query parameters from it

Cheers, Sergey

> 
> beans.xml snippet:
> <jaxrs:server id="documentServiceRest" address="/rest">
> <jaxrs:serviceBeans>
> <ref bean="documentServicesFacadeBean" />
> </jaxrs:serviceBeans>
> <jaxrs:providers>
> <ref bean="nodeDataProviderBean" />
> </jaxrs:providers>
> </jaxrs:server>
> <bean id="nodeDataProviderBean" class="foo.bar.NodeDataProvider" />
> 
> provider class:
>  package foo.bar
>  import ...
>  public class NodeDataProvider implements MessageBodyReader<NodeData> {
>    public boolean isReadable(Class<?> type, Type genericType, Annotation[]
> annotations) {
>        return NodeData.class.isAssignableFrom(type);
>    }
>    public NodeData readFrom(Class<NodeData> arg0, Type arg1, Annotation[]
> arg2, MediaType arg3,
>            MultivaluedMap<String, String> arg4, InputStream arg5) throws
> IOException,
>            WebApplicationException {
>        return new NodeData();
>    }
> }
> 
> -- 
> View this message in context: http://www.nabble.com/MessageBodyReader-implementation-problem-tp20581190p20581190.html
> Sent from the cxf-user mailing list archive at Nabble.com.
> 
>