The Cloud Guy
The Cloud Guy

Reputation: 982

Jersey JSON not working for latest Jersey API

I have been through several links figuring out how do I return JSON response in a RESTful webservice created using Jersey. Here is my code:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ScraperWebProject</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <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.myscraper</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>

MyScraper.java

package com.myscraper;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;


@Path("/hello")
public class MyScraper {

    @GET
    @Produces( {MediaType.APPLICATION_JSON })
    public SearchModel sayJsonHello() {
        System.out.println("JSON text hello called");
        SearchModel s = new SearchModel("My First Search", "My first search is done");
        return s;
    }

    @GET
    @Produces( { MediaType.TEXT_XML })
    public SearchModel sayPlainTextHello() {
        System.out.println("Plain text hello called");
        SearchModel s = new SearchModel("My First Search", "My first search is done");
        return s;
    }
}

SearchModel.java

package com.myscraper;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class SearchModel {

    private String title;
    private String description;

    public SearchModel(){

    }
    public SearchModel(String title,String desc){
        this.title = title;
        this.description= desc;

    }

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "SearchModel [title=" + title + ", desc=" + description + "]";
    }
}

I am somehow unable to get the request mapped to the getJSONHello() method. The solution found at this Link says to use Jersey JSON but the xml provided is not valid for the latest Jersey version. It uses com.sun relation property which is valid only for older version of Jersey.

Upvotes: 0

Views: 878

Answers (2)

Paul Samsotha
Paul Samsotha

Reputation: 209132

You need to add the following dependency for Jersey 2

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

Upvotes: 1

Er Kapil Mehta
Er Kapil Mehta

Reputation: 79

<pre>call api by link     /rest/hello/sayJsonHello  etc. By  Get method because it needs complete path for method sayJsonHello</pre>




package com.myscraper;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;


    @Path("/hello")
    public class MyScraper {

        @GET
    @Path("/sayJsonHello")
        @Produces( {MediaType.APPLICATION_JSON })
        public SearchModel sayJsonHello() {
            System.out.println("JSON text hello called");
            SearchModel s = new SearchModel("My First Search", "My first search is done");
            return s;
        }

        @GET
    @Path("/sayPlainTextHello")
        @Produces( { MediaType.TEXT_XML })
        public SearchModel sayPlainTextHello() {
            System.out.println("Plain text hello called");
            SearchModel s = new SearchModel("My First Search", "My first search is done");
            return s;
        }
    }

Upvotes: 0

Related Questions