0

I have a simple REST API i am trying to get running and it's giving me a HTTP 404 error. AFAICS it looks right but obv not ... Tomcat is running and i get the Eclipse browser come up with HTTP404. Tomcat doesnt help with all its errors but they are all just warnings but i can pop them in here if needed, will clutter the question though.

I think its to do with the jersey format, the xml or both but not sure.

*****Updated the question to include a xml update and a tomcat error.******

My class is thus:

package WS;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

//annotations
@Path("/book")
public class Book{
    @GET
    @Produces(MediaType.TEXT_XML)
    public String sayHelloXML(){
        String response = "<?xml version='1.0'?><hello>Hello there</hello>";
        return response;
    }
}

My Xml is thus: (note i think im using jersey 2.0 so i dont have to have anything here right?)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>RestApi</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>



  <servlet>
    <servlet-name>MyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <!-- The package where your resource classes are -->
        <param-value>WS</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>MyApplication</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>

... and my libs imported is thus: enter image description here

SEVERE: Allocate exception for servlet MyApplication java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:120) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1095) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:817) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)

Error i get back in browser when i hit http://localhost:8080/PK_WS/api/

javax.servlet.ServletException: Error instantiating servlet class org.glassfish.jersey.servlet.ServletContainer org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Unknown Source)

root cause java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Unknown Source)

Fearghal
  • 10,569
  • 17
  • 55
  • 97
  • What's the context you deployed that under? What's the URL you're trying to reach? Where's the output from your tomcat? – Jan Nov 16 '15 at 11:55
  • Tomcat: Added it to my question. context - im not sure what you mean but im testing using a browser and simply want a hello world to come back – Fearghal Nov 16 '15 at 12:20
  • URL: I want to reach whatever url would give me the response coded in the olnly java class/method - book – Fearghal Nov 16 '15 at 12:21

1 Answers1

1

That's not enough in the web.xml. You still need to configure Jersey, as it's the runtime that handle the JAX-RS processing. You can either do it with web.xml

<servlet>
    <servlet-name>MyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <!-- The package where your resource classes are -->
        <param-value>WS</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>MyApplication</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

Or without web.xml

@ApplicationPath("/api")
public class MyApplication extends ResourceConfig {
    public MyApplication() {
        packages("WS");
    }
}

With both options, /api will be the app url prefix. You can change it.

For more information check out Servlet Based Deployment from the Jersey User Guide.

Paul Samsotha
  • 205,037
  • 37
  • 486
  • 720
  • Thx for the response... what local url should i test? http://localhost:8080/PK_WS/api/book? – Fearghal Nov 16 '15 at 12:15
  • I ask as http://localhost:8080/PK_WS/api/book and every variation i can think of returns nothing but http 404 error and i think i get a tomcat nullpointer error, il post it in question – Fearghal Nov 16 '15 at 12:16
  • I see so many questions related to Eclipse not loading project jars to server, it's rediculous. That's the problem though. I stopped using Eclipse, so I can't help you with that. But you can try to put all the jars in the WEB-INF/lib. – Paul Samsotha Nov 16 '15 at 12:21
  • They are in WEB-INF/lib and imported into java build path in properties etc. – Fearghal Nov 16 '15 at 12:23
  • See the last screenshot of the imported jars, do they look correct? – Fearghal Nov 16 '15 at 12:23
  • It the same error most likely for the reason I described. As long as you have the ClassNotFound, the jars aren't getting loaded. If you know how (or even if you don't know how) to use Maven, you can check [this out](http://stackoverflow.com/a/30020830/2587435). I guarantee you that even if you solve this problem, you are going to run into other problems where you want to use other features that require other Jersey jars. Instead of having to search for them, let Maven do the job. Most answers you find related to support for other features (like JSON support) will being using Maven – Paul Samsotha Nov 16 '15 at 12:33
  • Looking at your image, the jars are not directly in the WEB-INF/lib, they are in WEB-INF/lib/jaxrs-ri/lib – Paul Samsotha Nov 16 '15 at 12:42
  • oh shoot, i bet thats it, if it is thats ridiculous. – Fearghal Nov 16 '15 at 12:43
  • Nope, that still fails for exactly the same issue. I think im missing a dependency, do you know if i am missing a jar? – Fearghal Nov 17 '15 at 12:13
  • From the image looks like those are all the jars from the distribution. It's all you need. – Paul Samsotha Nov 17 '15 at 14:33
  • I needed to CLEAN THE PROJECT. what a load of nonsense. thx for you help anyhow! – Fearghal Nov 17 '15 at 17:35