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

10,503

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.`

Share:
10,503
Stu
Author by

Stu

I am an Enterprise Architect for my day job. However I am a geek at heart. I spend many of my evenings still coding just to learn. I have written code in a wide range of languages. At the start of my career I was heavily involved in the Oracle Database and E-Business Suite of products. I still love data architecture and application design. I have worked and played with many flavors of databases: Oracle, MySQL, MongoDB, Neo4J. I am still a Data Architect at heart and love to see how to best use the various types of databases. I have written code in PL/SQL, C, Java, Ecmascript/JavaScript. Now days I am just a Seasoned Enterprise Architect with almost 30 years experience. I work with executives to define progressive and forward looking architecture while meeting current and long term business objectives as well as designing, developing and implementing all aspects of enterprise applications, including client, application server, data schema and database design for high availability solutions, both hardware and software.

Updated on June 25, 2022

Comments

  • Stu
    Stu almost 2 years

    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