Durch das Jersey Projekt existieren Bibliotheken die es Java Entwicklern besonders einfach machen REST Web Services zu entwickeln. In diesem Tutorial werde ich zeigen wie einfach es ist eine Web Service zu schreiben der uns einfache Mathematische Berechnung zurückliefert.

1.)
Wir erstellen in unserer Entwicklungsumgebung, in meinem Beispiel Eclipse, ein Web Projekt.  In das WEB-INF/lib Verzeichnis packen wir alle für Jersey benötigten JARs die es bei Jersey/Downloads runterzuladen gibt.  Für dieses Tutorial benötigen wir folgende Bibliotheken: jersey-server.jar, jersey-core.jar, jsr311-api.jar, asm.jar, jaxb-impl.jar, jaxb-api.jar, activation.jar, stax-api.jar

2.)
In unserer WEB-INF/web.xml fügen wir folgendes hinzu:

  
  	JAX-RS REST Servlet
  	REST-Servlet
  	
  		com.sun.jersey.spi.container.servlet.ServletContainer
  	
  	1
  
  
  	REST-Servlet
  	/services/*
  

3.)
Wir erstellen zwei Klassen die wir für unser Ergebniss benötigen.

Die erste Klasse MathResults kapselt unsere Mathematischen Ergebnisse.

package de.wstest;

public class MathResults {
	private String formel;
	private Integer ergebniss;
	public String getFormel() {
		return formel;
	}
	public void setFormel(String formel) {
		this.formel = formel;
	}
	public Integer getErgebniss() {
		return ergebniss;
	}
	public void setErgebniss(Integer ergebniss) {
		this.ergebniss = ergebniss;
	}
}

Und die zweite Klasse ServiceResult ist das Result unseres WebService

package de.wstest;

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class ServiceResult {
	private String message;
	private Integer returncode;
	private List ergebnisse;
	
	public Integer getReturncode() {
		return returncode;
	}
	public void setReturncode(Integer returncode) {
		this.returncode = returncode;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	
	public List getErgebnisse() {
		return ergebnisse;
	}
	public void setErgebnisse(List ergebnisse) {
		this.ergebnisse = ergebnisse;
	}
}

4.)
Jetzt erstellen wir eine weitere Klasse CalculatorService, diese ist unser eigentlicher Webservice und wird durch Annotions als dieser gekennzeichnet. Ein gute Übersicht über zulässige Annotions findet Ihr im Wiki von Jersey.

package de.wstest;

import java.util.LinkedList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

@Produces("application/xml")
@Path("calculator")
public class CalculatorService {

	@GET
	@Path("calc")
	@Produces("application/xml")
	public ServiceResult add(@QueryParam("a") Integer a, @QueryParam("b") Integer b) {
		
		ServiceResult r = new ServiceResult();
		List ergs = new LinkedList();
		
		if(a == null || b == null)
		{
			r.setMessage("No Values!");
			r.setReturncode(8);
			r.setErgebnisse(ergs);
			return r;
		}

		r.setMessage("Results for Value a = "+a+", Value b = "+b);
		r.setReturncode(0);
		MathResults e1 = new MathResults();
		e1.setFormel("a + b");
		e1.setErgebniss(a+b);
		MathResults e2 = new MathResults();
		e2.setFormel("a - b");
		e2.setErgebniss(a-b);
		MathResults e3 = new MathResults();
		e3.setFormel("a * b");
		e3.setErgebniss(a*b);
		
		ergs.add(e1);
		ergs.add(e2);
		ergs.add(e3);
		
		
		r.setErgebnisse(ergs);
		return r;
	}
}

Fertig ist unsere RESTFull Webservice. Nach dem deployen in einem ServletContainer wie Tomcat erhalten wir nach einem Aufruf des Webservices im Browser

http://localhost:8080/wstest/services/calculator/calc?a=234&b=456

folgendes Ergebniss:


	
		690
		a + b
	
	
		-222
		a - b
	
	
		106704
		a * b
	
	Value a = 234, Value b = 456
	0

Durch einen Aufruf der URL

http://localhost:8080/wstest/services/application.wadl

erhalten wir eine Übersicht über unsere Services und deren Parameter.


    
    
        
            
                
                    
                        
                        

                    
                    
                        
                    
                
            
        
    

Fertig ist in wenigen Schritten unser REST Web Service der uns eine Liste von Berechnungen für einen Eingabe zurückliefert.

RESTful Web Services (JAX-RS) mit Jersey
Tagged on:                     

22 thoughts on “RESTful Web Services (JAX-RS) mit Jersey

  • Pingback:Java, Webprogrammierung, Linux und mehr

  • 2009-06-02 at 17:18
    Permalink

    Zitat: “Nach dem deployen in einem ServletContainer wie Tomcat….”, wie schaut dieser Deployvorgang aus? bzw. wie deployt man diesen WebService im Glassfish?

    lg

    Reply
    • 2009-09-01 at 08:41
      Permalink

      Könntest du mir auch noch einmal sagen, wie ich das dann deploye?
      danke =)

      Reply
      • 2009-09-01 at 08:41
        Permalink

        ach so ein mist – hier gibt es ja das +-Zeichen *gg*
        danke dann lese ich mir das mit dem deployen durch – danke

        Reply
      • 2009-09-01 at 09:48
        Permalink

        Exportiere dein Anwendung die du z.B. in Eclipse erstellt hast einfach als WAR-Datei (in Eclipse –> Export… –> Web –> WAR file) und kopiere die WAR Datei in den Deploy Pfad deines Anwendungsservers, bei Tomcat ist das dann das Verzeichnis webapps.

        Reply
  • 2009-06-07 at 11:00
    Permalink

    Hi danke für die schnelle Antwort und ja das mitn deploy-Vorgang ist auch kein Problem, eine Frage hätt ich noch, wie ist es möglich, dass ich dem WebService Objekte von eigenen definierten Klassen übergebe? also keine Longs Strings etc…

    Reply
    • 2009-06-09 at 09:14
      Permalink

      Meines Wissens kannst du bei REST WebServices nur mit einfachen Datentypen wie String, Integer und Long arbeiten. Wenn du komplexe Parameter brauchst solltest du dir die SAOP basierten WebServices ansehen.

      Reply
  • 2010-05-20 at 12:50
    Permalink

    wollte das ganze gerne über Glassfish starten – er findet aber irgendwie den service nicht 🙁
    gibts da irgendwas besonderes zu beachten?

    Reply
    • 2010-05-29 at 19:41
      Permalink

      @Niels
      Du musst aufpassen, daß die URI richtig/komplett ist
      bspw.
      http://localhost:{port}/{contextPath}/resources/{ResourcePath}
      context Deiner App sei beispielsweise TestWeb und im @Path der ResourceKlasse steht @Path(“myTest”)
      http://localhost:8080/TestWeb/resources/myTest

      Bei Vista und Win7 sollte Glassfish zudem nicht unter C:Program Files installiert sein (was er standardmäßig tut), da hier die Zugriffsrechte vom Betriebssystem eingeschränkt sind.

      Reply
  • 2010-06-09 at 07:39
    Permalink

    ah cool danke, geht

    da war mein fehler 😉

    Reply
  • 2010-06-10 at 13:59
    Permalink

    hallo,

    statt: @QueryParam(“a”) Integer a
    vllt: @QueryParam(“obj”) Objekt o

    gibs eine möglichkeit objekte zu übergeben, oder muesste man da @GET vllt nehmen, hat da wer vielleicht ein bsp, wäre super 🙂

    mfg freak

    Reply
  • 2011-05-15 at 22:36
    Permalink

    Danke für das Tutorial, hat auf anhieb geklappt.

    Reply

Leave a Reply to freakCancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.