JSON example with RESTEasy + Jackson
Jettison as JSON provider
You may also interest to read this RESTEasy + Jettison + JAXB example.
You may also interest to read this RESTEasy + Jettison + JAXB example.
Many like Jackson JSON processor, and it supported in RESTEasy. In this tutorial, we show you how to convert an object to JSON format and return it back to the client.
1. RESTEasy + Jackson
To integrate Jackson with RESTEasy, you just need to include “resteasy-jackson-provider.jar“.
Note
When RESTEasy returned a json output, it will use Jackson provider to convert it automatically. You do not need to code a single line to integrate both.
When RESTEasy returned a json output, it will use Jackson provider to convert it automatically. You do not need to code a single line to integrate both.
File : pom.xml
<repositories>
<repository>
<id>JBoss repository</id>
<url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>2.2.1.GA</version>
</dependency>
</dependencies>
2. Simple Object
A simple object, later convert it into JSON format.
package com.mkyong.rest;
public class Product {
String name;
int qty;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getQty() {
return qty;
}
public void setQty(int qty) {
this.qty = qty;
}
}
3. JAX-RS
Annotate the method with @Produces("application/json")
. RESTEasy will use Jackson provider to handle the JSON conversion automatically.
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
@Path("/json/product")
public class JSONService {
@GET
@Path("/get")
@Produces("application/json")
public Product getProductInJSON() {
Product product = new Product();
product.setName("iPad 3");
product.setQty(999);
return product;
}
@POST
@Path("/post")
@Consumes("application/json")
public Response createProductInJSON(Product product) {
String result = "Product created : " + product;
return Response.status(201).entity(result).build();
}
}
Disabled RESTEasy auto scanning.
You must disabled the RESTEasy auto scanning, and register your REST service manually, otherwise, you will hits this error. Hope it get fix in future release.
You must disabled the RESTEasy auto scanning, and register your REST service manually, otherwise, you will hits this error. Hope it get fix in future release.
File : web.xml
<!-- disabled auto scan
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param> -->
<context-param>
<param-name>resteasy.resources</param-name>
<param-value>com.mkyong.rest.JSONService</param-value>
</context-param>
4. Demo
See GET and POST method.
1. GET method
When URI pattern “/json/product/get” is requested, following JSON file will be returned.
{
"qty":999,
"name":"iPad 3"
}
2. POST method
You can “post” the json format string to URI pattern “/json/product/post“, it will convert into “Product” automatically.
Download Source Code
Download it – JAX-RS-Download-JSON-Jackson-Example.zip (8 KB)
I followed what u have mentioned in the tutorial, but facing
org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: org.mgiver.vo.Task of media type: application/json
error. Please let me know how to resolve this.
Thanks,
please update
How to create that URL for services, without URL i cannot able to run the project. Please help me with that
Hi, thanks for sharing the knowledge. You are well known in Brazil! I have a following doubt, do you have @Delet @Put examples? Thank you so much !!!
that’s the first site where all that stuff is explained in a simple and clean way, without relying on some specific tools etc. thank you!
by this @ character is getting converted into @ can you please help me on that.
can you please give a simple way as above if i don’t use maven and directly create dynamic web project in eclipse. As there is no pom.xml in my project i can not set the dependencies and the method doesn’t work for me… Please reply.
try just download jar files defined in pom.xml from maven repo and put them in libs folder
how to register other webservice in web.xml if i register in web.xml jboss 7 gives war failed error
I would really like to know how to get this running basiclly a reask of djangofan
Can you tell me how you start the web app to listen on port 8080? Where is the “RESTfulExample” uri defined? If I should run in Jetty, how do I generate the .war? Will this not work using Eclipses standard edition?
If i Commect the below piece of one line Code then only i can Able to Execute the Program.
//@Produces(“application/json”)
Please help me with out commenting the above line How can i Execute the Program’
I have written one rest webservice which consumes XML.
When my client invokes web service with a JSON as input it is returing an error “415 Unsupported Media Type”.
So here my question is how to return my cutome error meesage.
Thanks,
Sudhir
Get is working fine . But as soon as i try “post ” it gives me following error ..
SEVERE: Failed executing POST /product/post
org.jboss.resteasy.spi.UnsupportedMediaTypeException: Cannot consume content type
at org.jboss.resteasy.core.registry.Segment.match(Segment.java:117)
at org.jboss.resteasy.core.registry.SimpleSegment.matchSimple(SimpleSegment.java:33)
at org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:327)
at org.jboss.resteasy.core.registry.SimpleSegment.matchSimple(SimpleSegment.java:44)
at org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:327)
at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:374)
at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:367)
at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:350)
at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:192)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:125)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
If one uses resteasy 2.2.3 (or later), there’s no need to disable auto scan.
From your website, we are able to get the data from client side if the json return us the single record. How about the multiple records? Thanks.
Your Code have really helped me a lot to understand and implement code using Restful WebServices.
Could you help me with @PUT & @ Delete type service, how to build them and how to write client for them…
Thanks and Regards,
Ajay
Hi dude, thank you very much for this post, it helped me to save a lot of time.
I have a question for you: I’d like to create a javascript client, using jQuery for example, wich communicates with a server made like you explain here, how can I create automatically json strings on the client side wich can be translated by Jackson without problems? For example I’d like to have something to be used on the client side that permitt me to create a json string for a product who’s data are collected from a form.
Than you!
java.lang.LinkageError: loader constraint violation: when resolving field “DATETIME” the class loader (instance of org/jboss/classloader/spi/base/BaseClassLoader) of the referring class, javax/xml/datatype/DatatypeConstants, and the class loader (instance of ) for the field’s resolved type, javax/xml/namespace/QName, have different Class objects for that type
com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.(RuntimeBuiltinLeafInfoImpl.java:224)
com.sun.xml.bind.v2.model.impl.RuntimeTypeInfoSetImpl.(RuntimeTypeInfoSetImpl.java:61)
com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:129)
com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:81)
com.sun.xml.bind.v2.model.impl.ModelBuilder.(ModelBuilder.java:152)
com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.(RuntimeModelBuilder.java:89)
com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:456)
com.sun.xml.bind.v2.runtime.JAXBContextImpl.(JAXBContextImpl.java:302)
com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1136)
com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:211)
javax.xml.bind.ContextFinder.find(ContextFinder.java:372)
javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
org.jboss.resteasy.plugins.providers.jaxb.json.BadgerContext.(BadgerContext.java:22)
org.jboss.resteasy.plugins.providers.jaxb.json.JsonJAXBContextFinder.find(JsonJAXBContextFinder.java:97)
org.jboss.resteasy.plugins.providers.jaxb.json.JsonJAXBContextFinder.findCachedContext(JsonJAXBContextFinder.java:51)
org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.findJAXBContext(AbstractJAXBProvider.java:52)
org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.getMarshaller(AbstractJAXBProvider.java:143)
org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.writeTo(AbstractJAXBProvider.java:119)
org.jboss.resteasy.core.interception.MessageBodyWriterContextImpl.proceed(MessageBodyWriterContextImpl.java:117)
org.jboss.resteasy.plugins.interceptors.encoding.GZIPEncodingInterceptor.write(GZIPEncodingInterceptor.java:63)
org.jboss.resteasy.core.interception.MessageBodyWriterContextImpl.proceed(MessageBodyWriterContextImpl.java:123)
org.jboss.resteasy.core.ServerResponse.writeTo(ServerResponse.java:250)
org.jboss.resteasy.core.SynchronousDispatcher.writeJaxrsResponse(SynchronousDispatcher.java:579)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:500)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119)
org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
Can you please explain your post method little bit more? I tried to execute it but couldn’t be successful.
Thanks for this amazing post
Please run the NetClientPost in the attached source codes.
Mannn… Thx very much!
Thanks for the effort you took to expand upon this post.
You said “You can “post” the json format string to URI pattern “/json/product/post“, it will convert into “Product” automatically”. Do you mean that if I open a Chrome without any plugin aimed for testing Rest Service like Postman it would work? At least, I tried http://localhost:8080/RESTfulExample/json/product/post? plus the line from your last image and it didn’t work. Please, correct me if I am wrong, as far as I know it is impossible to test a post to a rest web service straight from Browser unless you have some plugin installed. Note: I am prohibited to install plugins in Browser where I work.