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
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.`
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With