2016-07-06 7 views
8

Ich denke an zwei Möglichkeiten für den Umgang mit Abfrage/Anfrageparameter:Sollte ich @QueryParam oder @BeanParam in JAX-RS verwenden?

  1. Map einzelnen Parameter, um die Verfahrensparameter entsprechen:
@GET 
public String blah(@QueryParam("testParam") String testParam) { 

} 
  1. Karte alle Parameter auf die Eigenschaften einer Java Bean:
@GET 
public String blah(@BeanParam RequestParamBean bean) { 

} 

Die zweite Option scheint attraktiver zu sein, da sie es ermöglicht, die Validierungslogik von Eingabeabfrageparametern von der blah Methode zu verschieben und zu entkoppeln, deren Hauptverantwortlichkeit darin bestehen sollte, die Validierung zu einem Validator zu verarbeiten und zu delegieren (auch SOLID Prinzip) , Recht?).

Die meisten Beispiele, die ich sehe (tatsächlich, das bestehende Projekt, an dem ich gerade arbeite), verwenden jedoch nur die erste Option. Ich frage mich, ob es einen Grund gibt, warum die zweite Option nicht weit verbreitet ist? Gibt es irgendwelche Fallstricke? Ist das ein Anti-Muster? Ist das gegen jede Best Practice?

Antwort

7

Die @BeanParam Annotation wurde in JAX-RS 2.0 als Parameter Aggregator eingeführt (es bedeutet, dass es nicht in JAX-RS 1.0 verwendet werden kann).


Die Idee hinter der @BeanParam Annotation ist eine Java-Klasse zu aggregieren Parametern mit @XxxParam Anmerkungen kommentiert zu haben. Die folgenden @XxxParam Anmerkungen können verwendet werden, um die Felder eines Parameters Aggregator Klasse mit Anmerkungen versehen:

Neben den Feldern mit den Anmerkungen @XxxParam kann die Parameteraggregatorklasse Felder mit der Anmerkung @Context mit Anmerkungen versehen haben. Für eine Liste von Typen, die mit der @Context Annotation, check this answer, injiziert werden können.


Ich glaube, es ist nur eine Frage der Bequemlichkeit und Vorliebe der Entwickler. In vielen Situationen ist eine Klasse zum Aggregieren von Parametern nicht erforderlich. Die Verwendung der @XxxParam Annotationen in den Methodenparametern ist sehr praktisch.

Aber wenn Sie brauchen, um Wiederverwendung Parameter in verschiedenen Methoden oder Verfahren hat viele Parameter mit @XxxParam Anmerkungen kommentiert, für den @BeanParam Ansatz gehen.


In Ihrer Frage erwähnten Sie die SOLID principle. Aber vergiss nicht die KISS principle :)

Beginnen Sie mit den @XxxParam Annotationen in Ihrer Methode Parameter und nicht die @BeanParam Annotation übermäßig versuchen, ein Problem zu lösen, das Sie nicht haben. Sie können Ihren Code jederzeit umgestalten, um bei Bedarf eine Parameteraggregatorklasse zu erstellen.

+0

Vielen Dank für Ihre Antwort. Ich verstehe den letzten Absatz nicht. Der Grund, warum ich @BeanParam verwenden möchte, besteht darin, die Validierungslogik an einen anderen Ort zu delegieren, da mehr von den 50% des Codes in einer Methode für die Validierung von Methodenparametern verwendet wird. Außerdem ist die Validierung der Eingabeparameter in den verschiedenen Methoden inkonsistent - dh einige Methoden testen überhaupt nicht. Wenn wir also einen Mechanismus haben, der sicherstellen würde, dass wir all diesen Situationen gerecht werden, wäre das großartig. – user1539343

+0

@ user1539343 Wenn das @ BeanParam bietet, was Sie brauchen, verwenden Sie es :) –