REST Service errors with: resource is not available Glassfish 4.0 JAX-RS 2.0

Stu picture Stu · Jul 12, 2013 · Viewed 10.3k times · Source

I am trying to deploy a simple JAX-RS service on Glassfish 4.0 and keep getting the following error:

HTTP Status 404 - Not Found
type Status report
messageNot Found
descriptionThe requested resource is not available.
GlassFish Server Open Source Edition 4.0

War file deploys fine in Glassfish server however it appears the class loader is not doing its job and exposing the rest service appropriately. I am trying to figure out why class is not loading appropriately. I know it is probably a simple configuration change however I have not been able to find it.

Configuration: glassfish-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <context-root>/reports</context-root>
  <class-loader delegate="true"/>
  <jsp-config>
    <property name="keepgenerated" value="true">
      <description>Keep a copy of the generated servlet class' java code.</description>
    </property>
  </jsp-config>
</glassfish-web-app>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>Jersey</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
</web-app>

REST Service code:

package com.esa.report.rest.service;

import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.core.MediaType;

@Path("weeklyStatusReport")
@RequestScoped
public class WeeklyStatusReportService {

    @Context
    private UriInfo context;

    public WeeklyStatusReportService() {
    }

    @GET
    @Path("run/{esaId}")
    @Produces({MediaType.APPLICATION_XHTML_XML})
    public String runReport(@PathParam("esaId") String esaId){
        return("Hello esaId: "+esaId);
    }

    @GET
    @Produces("text/html")
    public String getHtml() {
        return("hello this is the weekly status report");
    }

    @PUT
    @Consumes("text/html")
    public void putHtml(String content) {
    }
}

The war is deployed with the root context of /reports and the url I am using is:

http://localhost:8080/reports/rest/weeklyStatusReport/run/123

Answer

Carlo Pellegrini picture Carlo Pellegrini · Jul 12, 2013

First of all, discard everything you wrote in web.xml. On GlassFish (and all JavaEE 7 containers) JAX-RS works out of the box, no configuration needed.

Then you must have in your classpath a javax.ws.rs.core.Application subclass, declaring an @ApplicationPath("/") (this tells the container to start the JAX-RS engine).

The other resources will be picked up automatically by the Application Server.`