35

I am trying to create a RESTful web-service and I created one but I am getting a

MessageBodyWriter not found for media type=application/json error

My Todo class:

package com.jersey.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.pojomatic.Pojomatic;
import org.pojomatic.annotations.AutoProperty;

@XmlRootElement
@XmlType(name = "todo")
@XmlAccessorType(XmlAccessType.FIELD)
@AutoProperty
public class Todo {

    @XmlElement(name = "summary")
    private final String summary;

    @XmlElement(name = "description")
    private final String description;

    public String getSummary() {
        return summary;
    }

    public String getDescription() {
        return description;
    }

    public Todo() {
        this(new Builder());    
    }

    public Todo(Builder builder) {
        this.summary = builder.summary;
        this.description = builder.description;
    }

    @Override
    public boolean equals(Object o) {
        return Pojomatic.equals(this, o);
    }

    @Override
    public int hashCode() {
        return Pojomatic.hashCode(this);
    }

    @Override
    public String toString() {
        return Pojomatic.toString(this);
    }

    public static class Builder {
        private String description;
        private String summary;

        public Builder summary(String summary) {
            this.summary = summary;
            return this;
        }

        public Builder description(String description) {
            this.description = description;
            return this;
        }

        public Todo build() {
            return new Todo(this);
        }
    }
}

And my Resource:-

package com.jersey.jaxb;

import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

@Path("/todo")
public class TodoResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getTodo(){
        Todo todo = new Todo.Builder().description("My Todo Object").summary("Created").build();
        return Response.status(Status.OK).entity(todo).build();
    }

}

My web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<display-name>MyFirstWebService</display-name>
<servlet>
  <servlet-name>Jersey REST Service</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
   <init-param>
     <param-name>jersey.config.server.provider.packages</param-name>
     <param-value>com.jersey.jaxb</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Jersey REST Service</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

</web-app>  

My Libraries:

aopalliance-repackaged-2.4.0-b10.jar
asm-debug-all-5.0.2.jar
hk2-api-2.4.0-b10.jar
hk2-locator-2.4.0-b10.jar
hk2-utils-2.4.0-b10.jar
jackson-jaxrs-json-provider-2.2.3.jar
javassist-3.18.1-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.4.0-b10.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet.jar
jersey-container-servlet-core.jar
jersey-guava-2.17.jar
jersey-media-jaxb.jar
jersey-server.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar

When I run this application on Tomcat server and run this : http://localhost:8080/MyFirstWebService/rest/todo

I get the error:

SEVERE: MessageBodyWriter not found for media type=application/json, type=class com.jersey.jaxb.Todo, genericType=class com.jersey.jaxb.Todo.

Om Sao
  • 7,064
  • 2
  • 47
  • 61
Raj Hassani
  • 1,577
  • 1
  • 19
  • 26
  • 1
    This really helped me to fix the issue if your not using maven https://stackoverflow.com/questions/30423776/post-to-jersey-rest-service-getting-error-415-unsupported-media-type/30424031#30424031 – Lakshmi Apr 12 '18 at 06:25

7 Answers7

54

You have jackson-jaxrs-json-provider which is a start..

But...

that artifact is still dependent on Jacskon itself, which includes all these artifacts

enter image description here

That's why we use Maven[1] (so we don't have to worry about this kind of thing :-). So go find these.

Then just add the package to the web.xml, and it should work

<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
    com.jersey.jaxb,
    com.fasterxml.jackson.jaxrs.json
</param-value>

1. Maven dependency

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.3</version>
</dependency>

Or use the below Jersey "wrapper" for the above dependency. It will register the Jackson providers (so we don't need to explicitly register like above), and the Jackson exception mappers, and start from version 2.17, provides support for Entity Data Filtering.

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey2.version}</version>
</dependency>

Note: The fact that we don't have to register anything with the above dependency, is made possible through the Auto-discovery feature of Jersey. If we for some reason disable the auto-discovery, you will want to explicitly register the JacksonFeature.

Paul Samsotha
  • 205,037
  • 37
  • 486
  • 720
  • I am currently not using Maven. So should download all these jars first and add it in my application and then add this line which you mentioned above to my web.xml. – Raj Hassani Mar 19 '15 at 23:21
  • [Here's the download page](http://wiki.fasterxml.com/JacksonDownload). I didn't need to use the last listed .jar file from the screenshot. Worked for me! –  Jun 24 '15 at 20:01
  • Scratch that. I did need "jackson-module-jaxb-annotations-2.2.3.jar" for turning JSON into XML. –  Jun 26 '15 at 18:04
  • Thiw will do the trick: org.glassfish.jersey.media jersey-media-json-jackson ${jersey.version} – bkomac Aug 16 '16 at 19:54
  • The provider package `com.jersey.jaxb` seems wrong, I don't think it exists. – Johannes Jander Jul 19 '17 at 13:19
  • Hi, on weblogic - it was not necessary to fidle around with any web.xml parameters. With the dependency: jackson-jaxrs-json-provider That you mentioned, weblogic 12.2.1.2 stopped complaining he did not know how to render the response to JSON. On wildfly, no such dependency is needed. In this case, I am experimenting simply returning a LIst. Do you have any insight as to why this is the case? – 99Sono Aug 09 '17 at 13:42
17

The solution may be to make ensure that the model classes have a no-argument constructor.

And add this dependency on your pom.XML:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>
Milson
  • 1,525
  • 3
  • 15
  • 29
9

I had the same issue, i solved it by addind a empty constructor to the class

public SandBoxClass(){} //-> solved the issue**

public SandBoxClass(Integer arg1, Integer arg2) {
        this.arg1=arg1;
        this.arg2=arg2;
}
zelli79
  • 91
  • 1
  • 1
3

If you already have the jersey-media-moxy dependency added into your pom.xml. Make sure your entity class has the default constructor. I got this issue when I introduced a paramatrized constructor in the model class. Adding the default constructor again worked for me.

Chandan Kumar
  • 1,066
  • 10
  • 16
  • for those who are using lombok, as me, and are using ``@Builder``, you going to need add this annotations: ``@NoArgsConstructor`` ``@AllArgsConstructor.`` – Vielinko Mar 21 '17 at 16:50
1

As for me, it helped to register JacksonFeature:

public class App extends ResourceConfig {
   public App() {
       packages("info.ernestas.simplerest");
       register(new JacksonFeature()); // This magical line helped
   }
}
Ernestas Kardzys
  • 1,719
  • 2
  • 16
  • 21
0
  1. Update Library Jax-RS 2.0 and Jersey 2.5.1(JAX-RS-RI) only
  2. Return Bean object(todo) not response because while auto generating json or xml it response create issue.
Vimalesh Valiya
  • 121
  • 1
  • 5
0

Answered here: Obtaining "MessageBodyWriter not found for media type=application/json" trying to send JSON object through JAX-RS web service

As stated above:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>

For me I also had to add:

ClientConfig config = new ClientConfig();
    config.register(JacksonJsonProvider.class);
    return ClientBuilder.newClient(config)
jawn
  • 851
  • 7
  • 10