Spring 3 steht vor der Tür - ein erster Ausblick

Seite 3: REST

Inhaltsverzeichnis

Um die Neuerungen von Spring 3 in den Bereichen Web und REST (Representational State Transfer; siehe Glossar) zu verstehen, lohnt sich zunächst ein kurzer Blick auf die Änderungen in Spring 2.5 in diesem Bereich. Das folgende Listing zeigt einen Web-Controller, der lediglich auf Annotationen aufbaut.

@Controller 
public class MyController {

@RequestMapping("/removeBook")
public String removeBook(
@RequestParam("book") String bookId) {
// tu was Sinnvolles
return "redirect:myBooks";
}
}

Wie man sieht, annotiert der @Controller die Klasse. Ist Spring richtig konfiguriert, kann dadurch automatisch eine Spring-Bean aus dieser Klasse erzeugt werden. Die @RequestMapping-Annotation definiert, bei welcher URL die so annotierte Methode aufgerufen wird. Dabei können einzelne Parameter des HTTP Request mit Annotationen für die Methoden-Parameter wie @RequestParam ausgelesen werden. Die Methode gibt in dem vorliegenden Fall den Namen der nächsten View an, in diesem Fall ein Redirect. Mit diesem Vorgehen ist es einfach, Web-Controller zu entwickeln.

In letzter Zeit setzt sich im Web-Bereich die REST-Architektur durch. Sie spricht Geschäftsobjekte wie Kunden durch eine URL an. Man kann an die URLs unterschiedliche HTTP Requests schicken. Beispielsweise kann ein POST die Daten des Objekts ändern, und ein GET gibt die Daten zurück. Außerdem unterstützt HTTP weniger oft genutzte Methoden wie DELETE, die man zum Löschen verwendet.

Dieses Bereichs nimmt sich das neue Spring an. Hier ist in den ersten Milestones schon einiges zu sehen, sodass sich ein genauerer Blick auf den Technik-Ansatz lohnt.

@RequestMapping(value = "/reward/{id}", method = GET)
public Reward show(@PathVariable("id") long id) {
return rewardsAdminService.findReward(id);
}

Das vorherige Listing zeigt ein Beispiel. Im Wesentlichen sind die Funktionen aus Spring 2.5 übernommen und an einigen Stellen erweitert. Hier wird auf eine HTTP-GET-Methode reagiert. In der URL werden variable Anteile genutzt, man spricht auch von einem URI Template. Dabei wird ein Teil der URL an eine Variable angegliedert. Bei der URL "/reward/42" würde die Variable id an den Wert "42" gebunden, und genau diese Variable kann man in der Implementierung der Methode referenzieren, indem sie mit @PathVariable an einen der Methoden-Parameter gebunden wird.

Das Ergebnis der Methode ist ein Reward. Er wird durch die üblichen Spring-MVC-Mittel mit HTML dargestellt. Allerdings ist es für REST üblich, unterschiedliche Darstellungen der Daten anzubieten. Neben HTML gehören JSON, XML, Atom oder RSS zu den gebräuchlicheren Ansätzen. Hier führt Spring 3 nicht nur neue Views ein, es bietet zudem an, automatisch eine passende Darstellung auszuwählen. Dazu gibt es zwei grundlegende Ansätze: Zum einen kann der HTTP Header accepts die möglichen Darstellungsarten bezeichnen, beispielsweise accepts application/xml, zum anderen nutzt man einfach eine Erweiterung, schickt also ein GET an "/reward/42.xml", um eine XML-Darstellung zu bekommen. Übrigens wandert wegen der notwendigen XML-Unterstützung die Object/XML-Mapper-Abstraktion, die eine gemeinsame Schnittstelle zu Techniken wie JAXB oder XStream liefert, vom Spring-Web-Services-Projekt in das Framework.

Ebenfalls Einzug in Spring 3.0 hält eine Unterstützung für ETags. Dieser Mechanismus dient dazu, statt einer vollständigen Antwort in einem HTTP Request nur ein "alles beim alten" zu schicken. Dazu bekommt man mit jedem HTTP Reply einen ETag-Wert, der beim nächsten HTTP Request mitgeschickt werden kann, und der Server sendet dann entweder aktualisierte Daten oder eben ein "alles beim alten". Dadurch sind solche Szenarien wesentlich einfacher zu unterstützen.