# Eclipse mit Tomcat und Jersey



## saw (27. Apr 2014)

Hi, ich versuche mit ein Eclipse mit Tomcat so zu konfigurieren, dass ich einen REST Service programmieren kann. Leider scheitere ich schon am Hello World  Tomcat gibt mir einfach immer einen 404 Error.

Ich poste euch mal ein paar Infos, sind ja nur 2 relevante Files:


```
mathias@id83:~/.workspace/Jersey-HelloWorld$ find .
.
./.project
./src
./src/jersey
./src/jersey/helloworld
./src/jersey/helloworld/Hello.java
./.settings
./.settings/org.eclipse.wst.common.component
./.settings/.jsdtscope
./.settings/org.eclipse.wst.jsdt.ui.superType.name
./.settings/org.eclipse.wst.jsdt.ui.superType.container
./.settings/org.eclipse.wst.common.project.facet.core.xml
./.settings/org.eclipse.jdt.core.prefs
./.classpath
./build
./build/classes
./build/classes/jersey
./build/classes/jersey/helloworld
./build/classes/jersey/helloworld/Hello.class
./WebContent
./WebContent/WEB-INF
./WebContent/WEB-INF/lib
./WebContent/WEB-INF/lib/asm-all-repackaged-2.2.0.jar
./WebContent/WEB-INF/lib/osgi-resource-locator-1.0.1.jar
./WebContent/WEB-INF/lib/javax.inject-2.2.0.jar
./WebContent/WEB-INF/lib/javax.annotation-api-1.2.jar
./WebContent/WEB-INF/lib/jersey-container-servlet.jar
./WebContent/WEB-INF/lib/aopalliance-repackaged-2.2.0.jar
./WebContent/WEB-INF/lib/javax.ws.rs-api-2.0.jar
./WebContent/WEB-INF/lib/jersey-client.jar
./WebContent/WEB-INF/lib/hk2-utils-2.2.0.jar
./WebContent/WEB-INF/lib/jersey-common.jar
./WebContent/WEB-INF/lib/hk2-api-2.2.0.jar
./WebContent/WEB-INF/lib/jersey-guava-2.7.jar
./WebContent/WEB-INF/lib/jersey-container-servlet-core.jar
./WebContent/WEB-INF/lib/hk2-locator-2.2.0.jar
./WebContent/WEB-INF/lib/jaxb-api-2.2.7.jar
./WebContent/WEB-INF/lib/validation-api-1.1.0.Final.jar
./WebContent/WEB-INF/lib/persistence-api-1.0.jar
./WebContent/WEB-INF/lib/jersey-server.jar
./WebContent/WEB-INF/lib/org.osgi.core-4.2.0.jar
./WebContent/WEB-INF/lib/javassist-3.18.1-GA.jar
./WebContent/WEB-INF/lib/javax.servlet-api-3.0.1.jar
./WebContent/WEB-INF/web.xml
./WebContent/META-INF
./WebContent/META-INF/MANIFEST.MF
mathias@id83:~/.workspace/Jersey-HelloWorld$
```


```
package jersey.helloworld;

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

// Plain old Java Object it does not extend as class or implements 
// an interface

// The class registers its methods for the HTTP GET request using the @GET annotation. 
// Using the @Produces annotation, it defines that it can deliver several MIME types,
// text, XML and HTML. 

// The browser requests per default the HTML MIME type.

//Sets the path to base URL + /hello
@Path("/hello")
public class Hello {

  // This method is called if TEXT_PLAIN is request
  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String sayPlainTextHello() {
    return "Hello Jersey";
  }

  // This method is called if XML is request
  @GET
  @Produces(MediaType.TEXT_XML)
  public String sayXMLHello() {
    return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
  }

  // This method is called if HTML is request
  @GET
  @Produces(MediaType.TEXT_HTML)
  public String sayHtmlHello() {
    return "<html> " + "<title>" + "Hello Jersey" + "</title>"
        + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
  }

}
```

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>HelloWorld</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>de.vogella.jersey.first</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app> 
[/XML]

Ich dachte jetzt, dass ich durch http://localhost:8080/HelloWorld/rest/hello zumindest etwas anderes als 404 Error bekommen sollte. 

Hat jemand einen Tip fuer mich?


----------



## turtle (27. Apr 2014)

ich habe in meinem Jersey-Projekt folgende Libs unter WebContent/WEB-INF/lib

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.17.1.jar
jersey-core-1.17.1.jar
jersey-json-1.17.1.jar
jersey-server-1.17.1.jar
jersey-servlet-1.17.1.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
und das ist meine web.xml
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>de.vogella.jersey.first</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>de.vogella.jersey.first</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>  [/XML]


----------



## saw (27. Apr 2014)

Yo, du scheinst Jersey 1.7 zu verwenden. Ist im Prinzip das Tutorial welchem ich auch versucht habe zu folgen.


----------



## turtle (27. Apr 2014)

Yep, das Tutorial von vogella.

Ich meine mich zu erinnern, das die web.xml nicht richtig war.
Insbesondere 
[XML]<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>[/XML]


----------



## saw (27. Apr 2014)

Deswegen steht da bei mir 


```
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
```

 Aber auch das mag falsch sein. Wer weiss das schon ...


----------



## turtle (28. Apr 2014)

Da bin ich mir  sicher, das deine Version falsch ist:noe:
Ich nutze Eclipse und da kannst du ja mal Shift-Ctrl-T (Open Type) machen und ServletContainer eintippen. Dann sollte Eclipse die Klasse com.sun.jersey.spi.container.servlet.ServletContainer (enthalten in jersey-servlet-1.17.1.jar) finden.

Ich kann noch etwas genauer beschreiben, wie ich es eingerichtet habe...

Wie gesagt nutze ich Eclipse (Kepler) mit dem sysdeo-Tomcat-Plugin. 

Im Tomcat gibt es dabei eine context-Definitionsdatei unter tomcat/conf/Catalina/localhost und die heisst bei mir rest.xml
[XML]<Context path="rest" reloadable="true" docBase="D:\java\Java-Forum\Jersey\WebContent" workDir="D:\java\Java-Forum\Jersey\work" >
	<Logger className="org.apache.catalina.logger.SystemOutLogger" verbosity="4" timestamp="true"/>
	<Loader className="org.apache.catalina.loader.DevLoader" reloadable="true" debug="1" useSystemClassLoaderAsParent="false" />
</Context>
[/XML]
Du erkennst, das der Path ebenfalls rest heisst, also muss der Aufruf im Browser lauten

```
http://localhost:8080/rest/hello
```

Die web.xml sieht leicht anders aus, als gestern von mir gepostet.
[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>de.vogella.jersey.first</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>/</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app> [/XML]

Ich benutze gerne den Dev HTTP Client im Chrome-Browser, weil ich damit leicht requests zusammen basteln und abschicken kann.


----------



## saw (28. Apr 2014)

Hi turtle,

der einziger ServletContainer den mein Eclipse kennt ist org.glassfish.jersey.servlet.ServletContainer. Ich meine das ist eine der Neuerungen in Jersey 2.x.

Ich habs endlich geschafft mit

[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>HelloREST</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name> </param-name>
      <param-value>net.vxpertise.hellorest</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>[/XML]

Der ServletContainer ist org.glassfish.jersey.servlet.ServletContainer und für das Package Scanning muss jersey.config.server.provider.packages gesetzt werden.

Danke für den Beistand


----------



## turtle (28. Apr 2014)

Ah, du hast  Jersey 2.x. Ich nicht, nutze noch 1.17.

Aber schön, das es jetzt auch läuft:toll:


----------

