twain249
twain249

Reputation: 5706

REST + Java + Status 500 Internal Error

OK so I'm writing a REST server using Java and trying to test it but I keep getting Error Code 500 Please help. I've stepped through the code and know it reaches the bottom of this method with an ArrayList of DataClass objects that are correctly formatted (I've inspected them and run without the REST front end successfully).

Here is the REST method I'm calling

@GET
    @Produces(MediaType.APPLICATION_XML)
    public List<DataClass> receiveXML(
            @DefaultValue("null") @QueryParam("artist") String artist,
            @DefaultValue("null") @QueryParam("title") String title,
            @DefaultValue("null") @QueryParam("album") String album,
            @DefaultValue("null") @QueryParam("genre") String genre,
            @DefaultValue("null") @QueryParam("type") String type,
            @DefaultValue("false") @QueryParam("open") Boolean open,
            @DefaultValue("false") @QueryParam("close") Boolean close,
            @DefaultValue("noPath") @QueryParam("path") String path,
            @DefaultValue("noKey") @QueryParam("key") String key,
            @DefaultValue("null") @QueryParam("show") String show,
            @DefaultValue("null") @QueryParam("season") String season,
            @DefaultValue("null") @QueryParam("format") String format)
    {   

        if(!artist.equals("null"))
            this.artist = artist;
        if(!title.equals("null"))
            this.title = title;
        if(!album.equals("null"))
            this.album = album;
        if(!genre.equals("null"))
            this.genre = genre;
        if(!type.equals("null"))
            this.type = type;
        if(!open.equals("false"))
            this.open = open;
        if(!close.equals("false"))
            this.close = close;
        if(!path.equals("noPath"))
            this.path = path;
        if(!key.equals("noKey"))
            this.keyword = key;
        if(!show.equals("null"))
            this.show = show;
        if(!season.equals("null"))
            this.season = season;
        if(!format.equals("null"))
            this.format = format;

        MultivaluedMap<String,String> queryParams = buildMap();
        List<DataClass> resp = receive(queryParams);
        return resp;    
    }

Here is the DataClass

@XmlRootElement
public class DataClass {
    public String pathname;
    ArrayList<String> parsedSet;
    ResultSet resultSet;
    public String id, path, type, category, size, update, idMeta, title, description;
    public String genre, album, artist, show, season;

    public DataClass(ResultSet resultSet){
        this.resultSet = resultSet;
        parsedSet = new ArrayList<String>();
        setStringVariables();
    }
    /**
     * Sets the pathname variable of the local file to be returned
     * @param pathname
     */
    public DataClass(String pathname){
        this.pathname = pathname;
    }


        methods to set the fields...

}

And Here is how I call the Server, I know that the server is being invoked correctly because I have a test method that just returns a string.

public static void testXML() {
    //a map that adds parameters that will then be added to the the WebService
    MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
    queryParams.add("type", "music");
    //retrieve info for an artist in XML format
    System.out.println(service.path("rest").path("media").queryParams(queryParams).accept(
            MediaType.APPLICATION_XML).get(String.class));
}

Here is my error

Exception in thread "main" com.sun.jersey.api.client.UniformInterfaceException: GET http://localhost:8080/TigrisRESTServer/rest/media?type=music returned a response status of 500 Internal Server Error
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:676)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503)
    at tigris.restserver.client.ourClient.testXML(ourClient.java:45)
    at tigris.restserver.client.ourClient.main(ourClient.java:28)

Sorry I forgot to include some stuff

The class where the receiveXML is defined has this

@Path("/media")
public class Server {
}

and here is the web.xml file

<?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">
  <display-name>RestServer</display-name>
  <servlet>
    <servlet-name>Tigris REST Server App</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>tigris.restserver.connection</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Tigris REST Server App</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

and this works fine (all it does is return a string)

Here's the client

public static void testTEST() {
    System.out.println(service.path("rest").path("media").accept(
            MediaType.TEXT_PLAIN).get(String.class));
}

Here's the server side

@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
    return "Hello Server";
}

Thank you twain249

Upvotes: 4

Views: 17609

Answers (1)

Henrik Andersson
Henrik Andersson

Reputation: 47172

Seems like you forgot to include what path it's supposed to map against.

@Path("/rest/")

GET http://localhost:8080/TigrisRESTServer/rest/media?type=music

if you want to map against the URL /rest/ that is.

For example, see this link Jersey Documentation

Upvotes: 1

Related Questions