Indeed, I expected it to be picked up automatically. But well, at this
moment, I'll try to not use this functionnality until I configure
Spring correctly if needed.

Don't hesitate to let me know if you implement this feature.

Thanks for all Sergey.


2009/4/29 Sergey Beryozkin <[email protected]>:
> Hi,
>
> So how do you register this provider ? Do you do it from Spring ?
> Perhaps you expect it be picked up automatically ?
> We might add a support for picking up the providers through the
> class-scanning - I honestly don't like this feature though but
> I think we'll need to do it anyway as some users do expect it be picked up
> from a classpath...
>
> thanks, Sergey
>
>
> ----- Original Message ----- From: "Raphael F." <[email protected]>
> To: <[email protected]>
> Sent: Wednesday, April 29, 2009 4:59 PM
> Subject: Re: Error : No message body writer found for response class :
> ArrayList. - A String is OK...
>
>
> Hello,
>
> Despite the update of CXF to 2.2.1, I still have the same error. I've
> tried to change my MessageBodyWriter implementation as follows :
>
> ---------------
> @Provider
> @Produces("*/*")
> public class StringListBodyWriter implements
> MessageBodyWriter<ArrayList<String>> {
>
> public long getSize(ArrayList<String> t, Class<?> type, Type genericType,
> Annotation[] annotations, MediaType mediaType) {
> return -1;
> }
>
> public boolean isWriteable(Class<?> type, Type genericType,
> Annotation[] annotations, MediaType mediaType) {
> return true;
> }
>
> public void writeTo(ArrayList<String> t, Class<?> type, Type genericType,
> Annotation[] annotations, MediaType mediaType,
> MultivaluedMap<String, Object> httpHeaders,
> OutputStream entityStream) throws IOException,
> WebApplicationException {
> BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
> entityStream));
> String ts = null;
> Iterator<String> i = t.iterator();
> while (i.hasNext()) {
> ts += i.next().toString();
> }
> bw.write(ts);
> bw.flush();
> }
> }
> ---------------
>
> But the same error occurs.
>
> At client side, I try to get the response body as an array of byte
> which I cast to a List of Strings, but for this moment, while error
> occurs, I can't check this step.
>
> So, what could I do ? Does something goes wrong with the code above ?
> Did I forgot a step, a class or another thing which I did not
> precised, or did I mistake ?
>
> Thanks for help.
>
> Raphael.
>
>
> 2009/4/28 Sergey Beryozkin <[email protected]>:
>>
>> Hi Raphael
>>
>> It should work fine - but I forgot top tell you that I only added
>> genericEntity support very recently, as part of working on the TCK
>> compliance, sorry about it.
>>
>> CXF 2.2.1 has just been released - it should have this fix.
>>
>> I believe the only reason GenericEntity is there is that it allows users
>> to
>> write providers for parameterized types. It has the information about the
>> raw type and the generic type, and the runtime uses this information to
>> find
>> a matching provider.
>>
>> By the way, in getSize() you just need to return -1, unless you actually
>> know the (Content-Length) value. It's a hint to the runtime on how to set
>> a
>> Content-Length HTTP response header, if it's -1 then it will be up to the
>> underlying HTTP container on how to set it
>>
>> in isWriteable() there's no need to check for media types, as you already
>> set them in Produces(), but you might want to check that the genericType
>> is
>> String.class...
>>
>> cheers, Sergey
>>
>>
>> ----- Original Message ----- From: "Raphael F." <[email protected]>
>> To: <[email protected]>
>> Sent: Tuesday, April 28, 2009 5:05 PM
>> Subject: Re: Error : No message body writer found for response class :
>> ArrayList. - A String is OK...
>>
>>
>> Hi Serguey,
>>
>> Thanks for your help. I'm just back from short holidays.
>>
>> So I've created a class implementing MessageBodyWriter interface for
>> it can accept List<String> entity, as shown below :
>>
>> -----------------------------------------------------------
>> @Provider
>> @Produces("text/xml,text/plain")
>> public class StringListBodyWriter implements
>> MessageBodyWriter<List<String>> {
>>
>> public long getSize(List<String> t, Class<?> type, Type genericType,
>> Annotation[] annotations, MediaType mediaType) {
>> Iterator<String> i = t.iterator();
>> long size = 0;
>> while (i.hasNext()) {
>> size += i.next().length();
>> System.out.println("La taille de " + i + " est : "
>> + i.next().length());
>> }
>> return size;
>> }
>>
>> public boolean isWriteable(Class<?> type, Type genericType,
>> Annotation[] annotations, MediaType mediaType) {
>> return type.equals(List.class)
>> && (mediaType.equals(MediaType.TEXT_PLAIN_TYPE) | mediaType
>> .equals(MediaType.TEXT_XML_TYPE));
>> }
>>
>> public void writeTo(List<String> t, Class<?> type, Type genericType,
>> Annotation[] annotations, MediaType mediaType,
>> MultivaluedMap<String, Object> httpHeaders,
>> OutputStream entityStream) throws IOException,
>> WebApplicationException {
>> BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
>> entityStream));
>> String ts = null;
>> Iterator<String> i = t.iterator();
>> while (i.hasNext()) {
>> ts += i.next().toString();
>> System.out.println("La String tString est :\n" + ts);
>> }
>> bw.write(ts);
>> bw.flush();
>> }
>> }
>> -----------------------------------------------------------
>>
>> But, at runtime, I still have a similar error message :
>> ---------------------------
>> 28 avr. 2009 16:49:58
>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor
>> writeResponseErrorMessage
>> ATTENTION: .No message body writer found for response class : ArrayList.
>> ---------------------------
>>
>> So how could the StringListBodyWriter class could be used when the
>> List based generic-entity Response is built ? I don't really see when
>> the StringListBodyWriter class is called :
>> ---------------------------
>> return Response.ok(new
>> GenericEntity<List<String>>(results){}).entity(results).build();
>> ---------------------------
>>
>> Thanks, Raphael.
>>
>>
>> 2009/4/23 Sergey Beryozkin <[email protected]>:
>>>
>>> Hi,
>>>
>>> One way is to register a message body writer for List which will check if
>>> it contains String. It is somewhat primitive but very simple solution
>>> which
>>> will also scale (as far as handling lists with various types is
>>> concerned)
>>> quite well.
>>> A more type safe way is to register a writer for List<String> and then
>>> wrap
>>> your list into a GenericEntity :
>>>
>>> List<String> results = this.getX2dbiResults(fileContent);
>>> return Response.ok(
>>> new GenericEntity<List<String>>(results)).build();
>>>
>>>
>>>
>>> cheers, Sergey
>>>
>>>
>>> ----- Original Message ----- From: "Raphael F." <[email protected]>
>>> To: <[email protected]>
>>> Sent: Monday, April 20, 2009 6:26 PM
>>> Subject: Error : No message body writer found for response class :
>>> ArrayList. - A String is OK...
>>>
>>>
>>> Hello everibody;
>>>
>>> In my program, i send a file @ /postXML from a client class using
>>> HttpClient and PostMethod objects. At server side, I have 2 String
>>> objects to return (one with data queried, the second with debug data,
>>> both are necessary) in a List<String> object to the client but I have
>>> a problem... Here is the server side code :
>>>
>>> [...]
>>> @POST
>>> @Path("/postXML")
>>> public Response postXML(InputStream fileContent) {
>>>
>>> List<String> results = this.getX2dbiResults(fileContent);
>>> Response resp = Response.ok(results).build();
>>>
>>> return resp;
>>> }
>>> [...]
>>>
>>> At client side, the code is :
>>>
>>> [...]
>>> RequestEntity entity = new FileRequestEntity(input, "text/xml");
>>> PostMethod post = new PostMethod("http://localhost:9000/postXML";);
>>> post.addRequestHeader("Accept", "text/xml");
>>> post.setRequestEntity(entity);
>>>
>>> HttpClient httpclient = new HttpClient();
>>>
>>> try {
>>> int result = httpclient.executeMethod(post);
>>> System.out.println("Response status code: " + result);
>>> System.out.println("Response body: ");
>>> System.out.println(post.getResponseBodyAsString());
>>> }
>>> finally {
>>> post.releaseConnection();
>>> }
>>> [...]
>>>
>>> When i execute client class, I get this message :
>>>
>>> Response status code: 500
>>> Response body:
>>> .No message body writer found for response class : ArrayList.
>>>
>>> At server side, I have this information :
>>> 20 avr. 2009 18:37:16
>>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor
>>> writeResponseErrorMessage
>>> .No message body writer found for response class : ArrayList.
>>>
>>> When I use a String for the result in Response.ok(results).build(),
>>> there is no error, so how is it possible to return another entity than
>>> String (i.e. an ArrayList) into Response.ok().build() ?
>>>
>>> Thanks for all.
>>
>>
>
>
>
> --
> Raphaël F.
>
> L'avenir de nos Libertés Fondamentales passe par la défense de nos
> Libertés Numériques !
> Promouvoir et défendre le logiciel libre : http://www.april.org/
> Les projets numériques liberticides du gouvernement français et de
> l'Europe : http://www.laquadrature.net/
> OpenOffice.org en images :
> http://www.csdm.qc.ca/sitsat-mtl/openoffice/index.htm
> "Ce qu'il y a de scandaleux dans le scandale, c'est qu'on s'y
> habitue." Méditez-y...
>



-- 
Raphaël F.

L'avenir de nos Libertés Fondamentales passe par la défense de nos
Libertés Numériques !
Promouvoir et défendre le logiciel libre : http://www.april.org/
Les projets numériques liberticides du gouvernement français et de
l'Europe : http://www.laquadrature.net/
OpenOffice.org en images : http://www.csdm.qc.ca/sitsat-mtl/openoffice/index.htm
"Ce qu'il y a de scandaleux dans le scandale, c'est qu'on s'y
habitue." Méditez-y...

Reply via email to