users@jersey.java.net

[Jersey] Re: WS itself playing the role of web-client

From: Arthur Yeo <artyyeo_at_gmail.com>
Date: Wed, 23 Mar 2011 17:35:42 -0700

Thanks again, Jakub.

I tried with this new code and it works for a several times and then it
stops working. Once it stops, I would have to bounce GF in order to get it
working again.
BTW, I do not need to process the image, I just need to return the image.
And, so, having it in an Image object is not important.

When it stops working, Server log has this WARNING:
===========
PWC1406: Servlet.service() for servlet ServletAdaptor threw exception
java.lang.IllegalArgumentException at java.net.URI.create(URI.java:842) at
com.sun.jersey.api.client.Client.resource(Client.java:350) at
==============

My new code ...
--------------
  @POST
   @Consumes("application/x-www-form-urlencoded")
   @Produces("image/*")
   public File myRsrc( @FormParam("upc") String blah1,
                           @FormParam("descr") String blah2) throws
IOException
   {

      String extUrl =
"https://SomeWsCreatedByOthers<https://somewscreatedbyothers/>
";

      Client client = Client.create();
      WebResource wr = client.resource(extUrl );

      File imgFile = wr.accept("image/*").get(File.class);

      if (imgFile.canRead()) {
         System.out.println("gotten the image file from WS and it is
readable.");
      }

      return (imgFile);
   }
----------------

On Wed, Mar 23, 2011 at 5:16 PM, Jakub Podlesak
<jakub.podlesak_at_oracle.com>wrote:

> Art,
>
> i was wrong. Jersey in fact provides image message body workers,
> but you have to use specifically java.awt.image.RenderedImage for writing
> (output),
> and java.awt.image.RenderedImage or java.awt.image.BufferedImage for
> reading (input).
>
> I.e.
>
> BufferedImage r = wr.get(Image.class);
>
> shoud just work.
>
> ~Jakub
>
>
> On 03/23/2011 11:27 PM, Jakub Podlesak wrote:
>
>> Hi Art,
>>
>> Jersey does not provide message body workers for java.awt.Image class
>> out of the box. You can get access to the message body input stream,
>> or get it (the message body) written into a temporary file and process
>> it from there, e.g.:
>>
>> File imgFile = wr.accept("image/*").get(File.class);
>> Image image = ImageIO.read(imgFile);
>>
>> After you fix this, you will get similar problem, when
>> trying to return the Image instance out from your resource method.
>> This time, you will be getting a missing message body writer error.
>> And again, you can return an OutputStream/File instead of the Image
>> to fix this.
>>
>> Another approach would be, if you wish to make your original code
>> work intact, to implement your custom java.awt.Image message
>> body workers. Please see the entity-provider example [1]
>> for reference.
>>
>> HTH,
>>
>> ~Jakub
>>
>> [1]
>> http://download.java.net/maven/2/com/sun/jersey/samples/entity-provider/1.5/entity-provider-1.5-project.zip
>>
>>
>> On 03/23/2011 10:05 PM, Arthur Yeo wrote:
>>
>>> I am having problems receiving an image using the Client class. The
>>> error I am getting in the Server log is this:
>>> -------
>>> WC1406: Servlet.service() for servlet ServletAdaptor threw exception
>>> com.sun.jersey.api.client.ClientHandlerException: A message body reader
>>> for Java type, class java.awt.Image, and MIME media type, image/png, was
>>> not found at
>>> --------
>>>
>>> here's the code I am running ... is it too simplistic here?
>>>
>>> ------
>>> @POST
>>> @Consumes("application/x-www-form-urlencoded")
>>> @Produces("image/*")
>>> public Image genQrc( @FormParam("upc") String blah1,
>>> @FormParam("descr") String blah2) throws
>>> IOException
>>> {
>>>
>>> String extUrl = "https://SomeWsCreatedByOthers";
>>>
>>> Client client = Client.create();
>>> WebResource wr = client.resource(extUrl );
>>>
>>> Image r = wr.get(Image.class);
>>> return (r);
>>> }
>>>
>>> On Wed, Mar 23, 2011 at 9:17 AM, Arthur Yeo <artyyeo_at_gmail.com
>>> <mailto:artyyeo_at_gmail.com>> wrote:
>>>
>>> Thanks, Pavel, for pointing me to the right direction.
>>> I found Jakub's blog.
>>>
>>> Now, one more question: if the WS I am calling is returning an
>>> image, what's the right way to handle this?
>>>
>>> Thanks,
>>> Art
>>>
>>>
>>> On Wed, Mar 23, 2011 at 3:46 AM, Pavel Bucek <pavel.bucek_at_oracle.com
>>> <mailto:pavel.bucek_at_oracle.com>> wrote:
>>>
>>> On 03/23/2011 05:20 AM, Arthur Yeo wrote:
>>>
>>> All,
>>> In the mix of things, I need one of my WS's to call another
>>> WS provided by another organization. In other words, my WS
>>> is now playing the role of a web client.
>>>
>>> What's the best way to do this in Jersey?
>>> Do I just stuff Java client code, like making use of the std
>>> URL class, in there?
>>> Or, Is there something else in Jersey you recommend?
>>>
>>>
>>> former, you need to create Client and WebResource by yourself,
>>> there is nothing better yet (but it might be soon).
>>>
>>> you might want to cache created client instance in some
>>> singleton, Client.create() is relatively expensive operation.
>>>
>>> Pavel
>>>
>>>
>>> --
>>> Arthur Y.
>>>
>>>
>>>
>>>
>>>
>>> --
>>> Arthur Y.
>>>
>>>
>>>
>>>
>>> --
>>> Arthur Y.
>>>
>>
>>
>>
>


-- 
Arthur Y.