15.12.2011

Spring 3 - Validierung von Parametern mit AOP

Im Rahmen der täglichen Entwicklung wird sich jeder schon mal Gedanken über die Behandlung von null Werten beim Aufruf der Businessmethoden gemacht haben. Sind die Methoden streng nach Clean Code Richtlinien entwickelt worden und beinhalten wirklich nur einen oder maximal zwei Parameter bleibt "nur" der Overhead für die Überprüfung der Aufrufe in jeder Businessmethode der Anwendung.

Einen schönen Ansatz zur Vermeidung des dadurch entstehenden Overheads bietet der Einsatz von AOP zur Überprüfung der Übergabewerte an eine Methode. Wie das ganze in einem Spring 3 Umfeld funktionieren kann, wird an einem konkreten Beispiel gezeigt.

Das Beispiel baut auf einem einfachen Taschenrechner mit den vier Grundrechenarten auf. Dieser wird als Service veröffentlicht und kann von anderen Beans als Referenz injected werden. Der Validator für die null Werte in Methoden wird ebenfalls als Bean bereitgestellt und definiert einen entsprechenden Pointcut zur Überprüfung.

Vergrößern durch Anklicken
In dem Klassendiagramm ist zusätzlich noch die Exception abgebildet, die geworfen wird, sobald ein fehlerhaftes Übergabeargument durch den Validator gefunden wird.
Die Überprüfung jeder Methode nach dem gleichen Schema macht nicht immer Sinn, somit wurde eine Annotation definiert, die eine Methode für die Überprüfung markiert. Somit besteht die Möglichkeit den Pointcut innerhalb des Validators so zu definieren, dass dieser auch ausschließlich bei Methoden mit dieser Annotation ausgeführt wird und sonst inaktiv bleibt. So werden unnötige Operationen vermieden und ausschließlich durch den Entwickler definierte Überprüfungen durchgeführt. Das folgende Sequenzdiagramm zeigt den Ablauf anhand eines Methodenaufrufs durch den Test.

Vergrößern durch Anklicken
Das Beispiel ist bewusst einfach aufgebaut, damit das Prinzip verständlich bleibt. Ein späterer Ausbau ist immer noch möglich. Die zentrale Klasse ist der Validator für die Validierung der null Werte während der Methodenaufrufe. Wie auch schon der AOP-Logger wird der Validator als Komponente bzw. Aspect definiert, so dass die Verwaltung komplett durch Spring realisiert wird. Der zu definierende Pointcut unterscheidet sich nur unwesentlich von dem Pointcut der bereits für das Logging definiert wurde.


Vergrößern durch Anklicken

Einziger Unterschied ist an dieser Stelle die zusätzliche Einschränkung des Pointcuts durch die Angabe der Annotation, mit der die Methode versehen werden muss. Somit werden nur Methoden überprüft die mit der Annotation de.sado.examples.spring.aop.parameter.validation.annotation.ValidateNullValues markiert worden sind. Wird bei der Überprüfung der Parameter ein null Wert festgestellt, wird eine NullparameterException geworfen.

Wünschenswert wäre an dieser Stelle sicherlich eine Angabe des Parameternamens für den null angegeben worden ist. Da ist aber leider eine Einschränkung durch Java selbst gegeben, da die Parameternamen im Bytecode nicht mehr zur Verfügung stehen und somit auch nicht für den Validator zugänglich sind. Einzige Möglichkeit wäre, dass der komplette Code mit Debug-Flag kompiliert wird. Dann wären auch die Namen der Parameter zugänglich. Für produktive Umgebungen aber sicherlich keine so gute Idee ;-)

Um nun die Validierung zu aktivieren, muss nur die entsprechende Annotation an der Methode angebracht werden. Mit einem sprechenden Namen kann jeder Entwickler recht schnell erkennen, was genau mit dieser Annotation ausgelöst wird.

Vergrößern durch Anklicken

Der Test der Lösung wird wieder durch einen einfachen Spring-JUnit-Test durchgeführt. Die erwartete Exception ist an dieser Stelle natürlich die NullParameterException, die durch den Validator ausgelöst wird.

Vergrößern durch Anklicken
Das gesamte Beispiel ist wie immer im Repository zu finden.

Keine Kommentare:

Kommentar veröffentlichen