Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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
like image 922
Stu Avatar asked Jul 12 '13 14:07

Stu


1 Answers

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

like image 75
Carlo Pellegrini Avatar answered Oct 04 '22 21:10

Carlo Pellegrini