[Jersey] Re: How to use a MessageBodyReader in JerseyTest

  • From: Jakub Podlesak <jakub.podlesak@...>
  • To: users@...
  • Subject: [Jersey] Re: How to use a MessageBodyReader in JerseyTest
  • Date: Thu, 07 Jul 2011 17:58:36 +0200

Hi Sean,

I think the docs are pretty vague in this regard and talk about
server side providers only.

Try to add the following method to the builder bellow:

.clientConfig(new DefaultClientConfig(CookieInfoReaderWriter.class))

Does it help?

~Jakub

On 07/07/2011 05:16 PM, Sean Landis wrote:
Hi Jakub,
Thanks for the reply. Here is my test case class constructor:

   public CustomerLoginWebServiceTest() throws Exception {
     super(new WebAppDescriptor.Builder("com.foo.customerlogin.jersey.webapp")
     .servletClass(JerseyServletContainer.class)
     .initParam("javax.ws.rs.Application",
CustomerLoginApplication.class.getName())
     .addFilter(ProcessingScopeFilter.class, "Processing Scope Filter")
     .addFilter(ServiceUsageTrackingFilter.class, "Service Usage
Tracking Filter")
     .build());
     service = new ServiceRequester(resource());
   }Builder

According to the Javadoc, the WebAppDescriptor.Builder() constructor
ought find my providers but it is not. Does anything pop out as being
incorrect?

Thanks,
Sean

On Thu, Jul 7, 2011 at 3:33 AM, Jakub Podlesak
<jakub.podlesak@...>  wrote:
Hi Sean,

You need to register the provider on the client side.
I do not know how you initialize the Client, but one way of doing it
could be as follows:

public class CookieTest extends JerseyTest {

    public CookieTest() throws Exception {
        super(CookieInfoReaderWriter.class.getPackage().getName());
    }

  ...
}

The provider class could also be added to your client config.

Should you need more details, please provide your test class
constructors, so that i could suggest the simplest way how to register
your provider there.

~Jakub


On 07/06/2011 04:00 PM, Sean Landis wrote:
It has been a few days and I haven't heard anything. Is this expected
behavior that the message body reader cannot be used by the client? Or
is there something I am missing to get it to work?

On Sun, Jul 3, 2011 at 2:51 PM,<sean.landis@...>    wrote:
I cannot get JerseyTest to find my MessageBodyReader.
I've defined the following message body reader/writer:


@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
@Provider
public class CookieInfoReaderWriter implements
MessageBodyWriter<CookieInfo>,
  MessageBodyReader<CookieInfo>    {

  @Override
  public boolean isReadable(Class<?>    type, Type genericType,
Annotation[] annotations,
      MediaType mediaType) {
    return type.equals(CookieInfo.class);
  }

  @Override
  public CookieInfo readFrom(Class<CookieInfo>    type, Type genericType,
Annotation[] annotations,
      MediaType mediaType, MultivaluedMap<String, String>    httpHeaders,
InputStream entityStream)
      throws IOException, WebApplicationException {
    return new CookieInfo(entityStream);
  }

  @Override
  public long getSize(CookieInfo t, Class<?>    type, Type genericType,
Annotation[] annotations,
      MediaType mediaType) {
    return -1;
  }

  @Override
  public boolean isWriteable(Class<?>    type, Type genericType,
Annotation[] annotations,
      MediaType mediaType) {
    return CookieInfo.class.isAssignableFrom(type);
  }

  @Override
  public void writeTo(CookieInfo t, Class<?>    type, Type genericType,
Annotation[] annotations,
      MediaType mediaType, MultivaluedMap<String, Object>    httpHeaders,
OutputStream entityStream)
      throws IOException, WebApplicationException {
    t.write(entityStream);
  }
}

The writer works great on the server. I'd like to be able to use the
reader in the JerseyTest like such:

CookieInfo ci =
webResource.path("/newCookies").type(MediaType.TEXT_PLAIN).get(CookieIn
fo.class);

But I get an exception:

SEVERE: A message body reader for Java class com.foo.dto.CookieInfo,
and Java type class com.foo.dto.CookieInfo, and MIME media type
text/plain was not found
Jul 3, 2011 2:46:03 PM com.sun.jersey.api.client.ClientResponse
getEntity
SEVERE: The registered message body readers compatible with the MIME
media type are:
text/plain ->
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider

com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider

com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceRea
der

com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader

com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader

com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General

com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General

com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.EntityHolderReader

Clearly my provider isn't found. This despite the following:

  public WebServiceTest() throws Exception {
    super(new WebAppDescriptor.Builder("com.foo.jersey.webapp")
    .build());

What I do instead...and I got the idea from the entityprovider sample
code...is:

    String stringCookies =
createRequest("/newCookies").get(String.class);
    CookieInfo ci = new CookieInfo(new
ByteArrayInputStream(stringCookies.getBytes()));

Which works, but is very unappealing compared to the way that doesn't
work.

What am I missing to get JerseyTest to use my message reader?

Sean





[Jersey] How to use a MessageBodyReader in JerseyTest

sean.landis 07/03/2011

[Jersey] Re: How to use a MessageBodyReader in JerseyTest

Sean Landis 07/06/2011

[Jersey] Re: How to use a MessageBodyReader in JerseyTest

Jakub Podlesak 07/07/2011

[Jersey] Re: How to use a MessageBodyReader in JerseyTest

Sean Landis 07/07/2011

[Jersey] Re: How to use a MessageBodyReader in JerseyTest

Jakub Podlesak 07/07/2011

[Jersey] Re: How to use a MessageBodyReader in JerseyTest

Sean Landis 07/07/2011
Terms of Use; Privacy Policy; Copyright ©2013-2016 (revision 20160708.bf2ac18)
 
 
Close
loading
Please Confirm
Close