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.
You have jackson-jaxrs-json-provider
which is a start..
But...
that artifact is still dependent on Jacskon itself, which includes all these artifacts
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
.
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With