Spring 3 steht vor der Tür - ein erster Ausblick
Seite 3: REST
REST eyerywhere
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.