RESTful web service creation tutorial with Java, Eclipse. Apache Tomcat, not working

64,778

Solution 1

To solve your problem, without using Maven, you need to add JAX-RS facet to your project. What's happening here is that Eclipse is not deploying the right libs to the server. This configuration can be accessed through your project's Properties | Project's Facets.

To be honest I don't know which specific jars to add to make Jersey work, because I use Maven to manage dependencies. So instead of the zip file, I've downloaded the Jersey bundle, and configured the JAX-RS facet with it. The effect of this can be seen on the project's Properties | Deployment Assembly, where Jersey's libs are already configured to be deployed. By the way is there you can manually setup the deployed libs to the server.

But then I remembered why I use Maven to manage dependencies. The bundle does not contain everything it needs to run Jersey. It's missing the asm jar (present in the zip file). So I had to add it to projects build path, and reconfigure de deployment assembly manually....

So, here is a tutorial with Maven, Jersey and Eclipse. Try it and draw your conclusions :)

Solution 2

I went through the same tutorial to develop my first RESTFUL service. In the beginning i also got 404 errors few times so i kept changing few things, finally it worked for me. This is what i did-

1) removed the rest from the URL-Pattern tab; i think that is there by mistake. 2) used the context root in the URL rather than the package name.

my url is, "http://mylocalhost:8080/contextroot/classname that is defined in the @path annotation.

hope it helps.

Solution 3

I repeated your example and it works out of the box on my machine. I downloaded jersey-archive-1.14.zip and put the whole content of the included lib directory into WEB-INF/lib, not just Jersey and jsr311-api-1.0 jar as you did.

The jars are:

  • asm-3.1.jar
  • jackson-core-asl-1.9.2.jar
  • jackson-jaxrs-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • jackson-xc-1.9.2.jar
  • jersey-client-1.14.jar
  • jersey-core-1.14.jar
  • jersey-json-1.14.jar
  • jersey-server-1.14.jar
  • jersey-servlet-1.14.jar
  • jettison-1.1.jar
  • jsr311-api-1.1.1.jar

Some of them might by unnecessary, you could try to reduce them. But start with all of them.

The error message is strange, though. It says that javax.servlet.Filter is missing, which should live in <your tomcat dir>/lib/servlet-api.jar. This file is always on the classpath when you run tomcat.

Solution 4

The servlet.jar shouldn't be at the resulting war file (or in WEB-INF/lib). It should be provided by the application server itself. (see Tomcat's FAQ) If you are using the Maven for building the project, you may set the scope of the servlet api as provided (link).

Another similar question here on StackOverflow.

Solution 5

You need to remove servlet.jar or any other jar containing javax.servlet.Filter from your WEB-INF/lib directory.

While you will need the class javax.servlet.Filter on your compile classpath in order for the sample code to compile, you need to ensure that you do not include this class in your webapp. From the Tomcat class loader HOWTO:

When Tomcat is started, it creates a set of class loaders that are organized into the following parent-child relationships, where the parent class loader is above the child class loader:

  Bootstrap
      |
   System
      |
   Common
   /     \   

Webapp1 Webapp2 ...

Basically, the (probably) servlet.jar in the webapp is probably not being found properly d/t the security configured in the Tomcat container.

You can see if javax.servlet.Filter is being loaded from a weird location by turning on verbose class loading verbose:class. Search for the class, if it's not coming from the Tomcat libs, that is likely your problem.

Share:
64,778
DavideChicco.it
Author by

DavideChicco.it

Machine learning &amp; biomedical informatics University of Toronto Toronto, Ontario, Canada http://www.davidechicco.it davidechicco(AT)davidechicco.it

Updated on July 09, 2022

Comments

  • DavideChicco.it
    DavideChicco.it almost 2 years

    I'd like to create and run a simple RESTful application on my pc. I'm using Java programming language, on Eclipse Helios IDE, with Apache Tomcat 7 server, on a Microsoft Windows Xp operating system.

    I've been trying to replicate the same procedure of this tutorial (from 3 to 3.4 steps) on my pc, but it does not work.

    Here's what I did:

    • created a Dynamic project on Eclipse, with Apache Tomcat 7 settings

    • put my Jersey and jsr311-api-1.0 jar files into the project \WEB-INF\lib\ directory

    • copied the code parts from the webpage to my project

    • right-clicked on the project, clicked on "Run as -> Run on server"

    • tried to reach the http://localhost:8080/de.vogella.jersey.first/rest/hello

    But there's what I see:

    Rest screenshot

    Why does it not work? What did I do wrong? Why?

    Many thanks!

    Edit:

    Here's what the console says:

    25-set-2012 9.35.07 org.apache.catalina.core.AprLifecycleListener init
    INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Programmi\Java\jdk1.6.0_21\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Programmi/Java/jre6/bin/client;C:/Programmi/Java/jre6/bin;C:/Programmi/Java/jre6/lib/i386;C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\System32;C:\WINDOWS\;C:\WINDOWS\System32; C:\Programmi\R-Language\R-2.13.1\bin\;C:\Programmi\OpenVPN\bin\; C:\Programmi\Java\jdk1.6.0_21\bin\; "C:\ApacheMaven\apache-maven-3.0.4\bin";;C:\Programmi\eclipseEC;
    25-set-2012 9.35.08 org.apache.tomcat.util.digester.SetPropertiesRule begin
    AVVERTENZA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:de.vogella.jersey.first' did not find a matching property.
    25-set-2012 9.35.10 org.apache.coyote.AbstractProtocolHandler init
    INFO: Initializing ProtocolHandler ["http-bio-8080"]
    25-set-2012 9.35.10 org.apache.coyote.AbstractProtocolHandler init
    INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
    25-set-2012 9.35.10 org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 3459 ms
    25-set-2012 9.35.10 org.apache.catalina.core.StandardService startInternal
    INFO: Starting service Catalina
    25-set-2012 9.35.10 org.apache.catalina.core.StandardEngine startInternal
    INFO: Starting Servlet Engine: Apache Tomcat/7.0.6
    25-set-2012 9.35.11 org.apache.catalina.startup.TaglibUriRule body
    INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
    25-set-2012 9.35.12 org.apache.catalina.startup.TaglibUriRule body
    INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
    25-set-2012 9.35.12 org.apache.catalina.startup.TaglibUriRule body
    INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
    25-set-2012 9.35.12 org.apache.catalina.core.ApplicationContext log
    INFO: Marking servlet Jersey REST Service as unavailable
    25-set-2012 9.35.12 org.apache.catalina.core.StandardContext loadOnStartup
    GRAVE: Servlet /de.vogella.jersey.first threw load() exception
    java.lang.ClassNotFoundException: javax.servlet.Filter
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1488)
        at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
        at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
        at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4741)
        at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5062)
        at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5057)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
    25-set-2012 9.35.12 org.apache.coyote.AbstractProtocolHandler start
    INFO: Starting ProtocolHandler ["http-bio-8080"]
    25-set-2012 9.35.12 org.apache.coyote.AbstractProtocolHandler start
    INFO: Starting ProtocolHandler ["ajp-bio-8009"]
    25-set-2012 9.35.12 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 1790 ms
    

    Maybe there's some class missing?