2009-08-24 5 views
4

Ich übersetze Code, der Implementierungen von Spring MVC-Controller verwendet, um das Annotation-Stereotyp @Controller zu verwenden. Bis auf ein Problem geht alles gut:Programmgesteuert Aufruf @Controller

Bei einer Anfrage/Antwort, wie bearbeite ich programmgesteuert Anforderungen für Annotation-basierte Controller?

Zuvor (unabhängig von der Implementierung) konnte ich nennen:

controller.handleRequest(request, response) 

Was ist das Äquivalent mit Anmerkungen? Ich hatte angenommen, es gäbe einige seine Utility-Klasse nach dem Vorbild der (vielleicht statisch?):

SpringAnnotationBasedControllerUtils.handleRequest(<? extends @Controller> handlerObject, HttpServletRequest request, HttpServletResponse response); 

die Details der @Controller Klischee erlaubten die Kartierung eine Anfrage an die dynamischen Signaturen zu handhaben, aber ich kann nicht finde so etwas.

Irgendwelche Vorschläge?

(Bitte keine Kommentare, warum dies eine schlechte Idee ist oder sollte nicht mit einem "guten" Design, etc. Dies ist Code unter Wartung und muss so nichtinvasiv wie möglich sein, so dass eine vollständige Umschreibung keine Option ist zu dieser Zeit.)

Danke!

Antwort

3

Sie rufen nur die Methode für das Objekt auf. Das ist einer der großen Vorteile von annotierungsgesteuerten Controllern. Sie können nur die Methoden schreiben, die Ihr Code benötigt, ohne dass Sie die Dinge aus der Form bringen müssen, um sie an die Schnittstellen anzupassen. Verbinden Sie einfach Ihre Controller-Bean mit Ihrem Code und rufen Sie die Methode direkt auf.

Oder sagen Sie, dass Sie den Mechanismus neu erfinden wollen, mit dem Spring Anforderungen an annotierte Controller anpasst? Wenn ja, sehen Sie sich die Quelle für die Klassen AnnotationMethodHandlerAdapter und DefaultAnnotationHandlerMapping von Spring an. Es ist komplex, obwohl annotierte Controller es einfacher machen, Controller zu schreiben, aber der zugrunde liegende Mechanismus ist unangenehm.

+0

Ich habe einen HandlerInterceptor, der manchmal eine kleine Teilmenge der Controller manuell aufrufen muss, daher muss die Controller-Schnittstelle grundsätzlich neu eingeführt werden. Es sieht so aus, als würde der AnnotationMethodHandlerAdapter tun, was ich brauche! Vielen Dank! –

2

Spring hat etwas namens HandlerAdapter, das eine Anfrage und eine Controller-Implementierung übernimmt und aufruft. Auf diese Weise können Controller aus anderen Frameworks im Frühling wiederverwendet werden. Sie wollen die AnnotationMethodHandlerAdapter. Ich glaube, Sie können dies selbst instanziiert:

HandlerAdapter adapter = new AnnotationMethodHandlerAdapter(); 
ModelAndView modelAndView = adapter.handle(request, response, controller); 

Ich habe etwas getan, ähnlich mich - aber ich bin nicht sicher, ob ich nicht etwas Wesentliches aus verlasse.

0

Sie könnten Ihre eigene Schnittstelle einführen, um dieses generische Handle-Verhalten einfach zu ermöglichen - angesichts des Neuschreibens - was wollen Sie programmatisch tun? z.B. Welche Art von Entscheidungsbaum - die integrierten Parameterzuordnungen sind ziemlich flexibel.

Verwandte Themen