2016-09-05 2 views
1

Ich schreibe eine JAX-RS-API und verwende die Response-Klasse als Rückgabetyp für jede Methode. Ich versuche jedoch, den "besten" Ansatz zur Validierung der Parameter herauszufinden.Validieren von Eingabeparametern für JAX-RS-Methoden

Ich habe bereits einige REST-APIs geschrieben und normalerweise benutzerdefinierte Validierungsroutinen in der Methode und dann über ein benutzerdefiniertes Rückgabeobjekt mit Validierungsnachrichten verfügen. Ich denke ich möchte das gleiche hier machen, aber ist das "bevorzugt"?

Ich weiß, es gibt Annotationen wie @NotNull, etc., die Sie anwenden können und benutzerdefinierte Validierung Nachrichten bereitstellen, aber ich mag nicht wirklich die Art, die endet suchen.

Also, was ich getan habe, ist, dass ich eine Return-Objekt-Bean schrieb, die ich als die .entity() für meine JAX-RS-Antwort verwende, und ich alle meine Validierungsnachrichten dort hineinlege. Ich verwende das gleiche Rückgabeobjekt für Erfolge und Fehler, aber es ist nur eine Frage, welche Parameter ich je nach Szenario dort aufstelle. Dies ist eine interne API, sodass keine externen Konsumenten vorhanden sind. Ich wollte nur den Rückgabetyp standardisieren, so dass immer das gleiche "Objekt" zurückgegeben wird.

Klingt das wie ein guter Ansatz? Ich bin ein wenig eingerostet in den Best Practices für REST API und habe wie verrückt gegoogelt, bin aber noch nicht zu den Best Practices gekommen.

+1

Was ist das Problem mit Bean Validierung und Anmerkungen wie '@ NotNull'? –

+1

Nun, ich möchte wirklich ein konsistentes Objekt von den API-Aufrufe zurückgegeben werden, unabhängig von Erfolg oder Misserfolg. Wenn ich die Annotationen verwende, passiert das nicht, da ich mein Rückgabeobjekt nicht konstruieren kann. – cloudwalker

Antwort

1

Eingangsvalidierung für RestAPI ist nicht direkt. Es gibt viele Internetressourcen, aber keine davon deckt einen eleganten Weg ab.

Wie Sie erwähnt haben, können die trivialen Eingabevalidierungen mithilfe der Annotation verschiedener Implementierungen der jax-rs-Bibliothek durchgeführt werden. Diese Anmerkungen können ausgefeilt sein, da Regex unterstützt wird. Das wird Ihnen helfen, mehr Validierungsfälle als @NotNull, @size usw. zu bedecken. Thesen Annotationen akzeptieren auch Nachricht als Eingabe, die Ihnen helfen wird, eine Nachricht anzupassen, die an einen Benutzer zurückgegeben werden muss.

Diese Anmerkungen können nicht sexy aussehen (besonders wenn Regex beteiligt ist); aber ich würde es immer noch lieber meinen eigenen Validator schreiben.

Die andere Sorge der Validierung, die ein wenig kompliziert ist, wenn Sie Einschränkungen validieren möchten (mehr wie eine Logik),

zum Beispiel sagen, Sie diese Anforderung haben: wenn der Parameter Ein Wert X hat, Parameter B muss nicht leer sein, sonst ist es OK, Parameter B leer zu haben. Dies ist nichts, was Sie mit dem üblichen javax.validation.constraints.* umgehen könnten. Ich habe keine gute Bibliothek gefunden, die damit umgehen könnte.

einen Blick auf

javax.validation.ConstraintViolation 

Sie eigene Validierungslogik schreiben könnte, dass die Bibliothek fängt an Ihre API-Aufruf wird aufgerufen, wann immer.

+0

Gotcha, ja, das macht Sinn. Das Hauptanliegen für mich ist, dass das Rückgabeobjekt immer dieselbe Struktur haben soll, unabhängig davon, ob es Fehler gab oder ob alles erfolgreich abgeschlossen wurde. Ich habe schon früher mit SOAP-Diensten mehr gearbeitet, deshalb denke ich, das ist der Grund, warum ich das hier machen möchte.Ich weiß nicht, dass dies das "Richtige" für REST-APIs ist, aber wie du schon sagtest, scheint es keinen sehr eleganten Weg zu geben. – cloudwalker

+0

Was Ihre REST-API-Benutzer betrifft, ist das, was Sie als Ausgabe angeben, ein bestimmter Medientyp (z. B. JSON oder XML). Es ist Aufgabe des API-Consumers, die Nutzdaten zu analysieren und zu verwenden. Sie könnten beispielsweise einen Indikator haben, der besagt, dass die Nachricht eine Erfolgsmeldung oder eine Fehlernachricht ist. basierend darauf würde der Benutzer erwarten, dass verschiedene Arten von Strukturen analysiert werden. Dies ist umstritten, aber persönlich würde ich lieber die beiden Modelle (Erfolg und Misserfolg) sauber und getrennt halten, anstatt sie zu mischen, um nur eine von beiden gleichzeitig zu verwenden. – LeTex

+0

und ... wie Sie sagten, könnte Ihrem Benutzer ein gemeinsamer Einstiegspunkt gegeben werden, der mit einer bestimmten Entität "Response" antwortet, und die Entität könnte das Erfolgs- oder Fehlermodell sein. – LeTex

Verwandte Themen