1

I'm using Jersey in my REST-application. I need to test it with junit. But I got an com.sun.jersey.api.client.ClientHandlerException. Stacktrace:

SEVERE: The registered message body readers compatible with the MIME media type are:
application/octet-stream ->
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.RenderedImageProvider
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
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$StreamSourceReader
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

com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class        com.example.Student, and Java type class com.example.Student, and MIME media type application/octet-stream was not found
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:561)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:517)
at com.example.servlet.StudentResourceTest.test(StudentResourseTest.java:85)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

I do not know how to fix this bug. I'm looking forward to your help. My code:

@Path("/student")
@Component
public class StudentResourse {
@Autowired
private StrudentService service;

@Path("/getStudent/{id}")
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Student getStudent(@PathParam("id") long id) {
    return service.get(id);
}  
}

This class works fine. When I type in browser: http://127.0.0.1:8080/Application/student/getStudent/100500 it shows me student in xml My test class:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:configuration.xml")
@TestExecutionListeners({ DbUnitTestExecutionListener.class,
    DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class,
    TransactionalTestExecutionListener.class })
public class StudentResourseTest extends JerseyTest {

@Override
protected AppDescriptor configure() {
    return new WebAppDescriptor.Builder("com.example.servlet")
            .contextPath("context").build();
}

@Override
protected TestContainerFactory getTestContainerFactory() {
    return new HTTPContainerFactory();
}

@Test
@DatabaseSetup("dataset.xml")
public void test() throws UnsupportedEncodingException {
        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        WebResource service = client.resource(getBaseURI());
        ClientResponse response = service.path("getStudent").path("100500")
                .accept(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON)
                .get(ClientResponse.class);
        Student student = (Student) response.getEntity(Student.class);
        System.out.println(student);
}

@Override
public URI getBaseURI() {
    return UriBuilder.fromUri("http://127.0.0.1:8080/Application/student/")
            .build();
}

}

I'm using this dependency:

<dependency>
    <groupId>com.sun.jersey.jersey-test-framework</groupId>
    <artifactId>jersey-test-framework-http</artifactId>
    <version>1.2</version>
</dependency>

Student class marked as @XmlRootElement. Problem is in test class. Any ideas? Thanks for you answers

Oleksandr H
  • 2,965
  • 10
  • 40
  • 58
  • Do you use even Jersey in version 1.2? Do you need to use such an old version or can you switch to the latest which is 1.17.1? What is the HTTP status of the received response? – Michal Gajdos Oct 15 '13 at 11:46
  • It returns 404 Not Found. I do not know why, because it works in browser – Oleksandr H Oct 15 '13 at 12:13

3 Answers3

1

You're deploying your application to context context-path but then you're assuming (by overriding getBaseURI() method) that the application is deployed on Application context-path. Try to remove the overriding getBaseURI() method and change the test method to following:

@Test
@DatabaseSetup("dataset.xml")
public void test() throws UnsupportedEncodingException {
    ClientResponse response = resource()
        .path("students").path("getStudent").path("100500")
        .accept(MediaType.APPLICATION_XML)
        .get(ClientResponse.class);

    Student student = (Student) response.getEntity(Student.class);
    System.out.println(student);
}

Also check for HTTP response status (should be 200) and response media-type (should be application/xml in this case - if you request application/xml and get application/octet-stream something is clearly wrong).

Michal Gajdos
  • 10,339
  • 2
  • 43
  • 42
1

using below annortation @XmlRootElement and change library of jersey AND server log clean after publish the project

0

Please check A message body writer for Java type, class myPackage.B, and MIME media type, application/octet-stream, was not found

& this link to resolve your issue.I hope it is enough to sort out your problem.

Community
  • 1
  • 1
Anil
  • 1,470
  • 5
  • 24
  • 35