RESTful web service creation tutorial with Java, Eclipse. Apache Tomcat, not working
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.
DavideChicco.it
Machine learning & biomedical informatics University of Toronto Toronto, Ontario, Canada http://www.davidechicco.it davidechicco(AT)davidechicco.it
Updated on July 09, 2022Comments
-
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\
directorycopied 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:
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?