Ich spiele mit Jersey 2.21
herum und würde gerne wissen, ob es möglich ist, einen "optionalen" Parameter zu haben, der in der Anfrage an den Server enthalten sein kann oder nicht.
Ich möchte erfolgreich auf diese beiden Methoden zugreifen:
%Vor% Wie Sie sehen können, versuche ich, die Ganzzahl ( id
) als eine optionale Variable zu definieren.
Ich habe myMethod
wie folgt deklariert:
Das funktioniert:
%Vor%und das funktioniert auch:
%Vor% aber das wird nicht funktionieren und ich verstehe nicht warum. Es wirft einen 404 Not Found
Fehler:
Können Sie mir in die richtige Richtung zeigen, um das herauszufinden? Ich mag nicht, dass der Schrägstrich bei allen meinen REST-Methodenaufrufen obligatorisch ist und möchte ihn nach Möglichkeit unterdrücken.
Nachdem wir uns mit einigen Antworten in Optional @PathParam in Jax-RS beschäftigt haben, ist das Problem, dass mit diesem
%Vor% bewirkt, dass /
in der Erfassungsgruppe enthalten ist. Wenn Jersey versucht, /1
zu parsen, erhält es eine Ausnahme und sendet eine 404. Wir könnten einen String verwenden, aber dann wird es hässlich, da wir die führenden /
und parse es selbst.
Die andere Lösung (die für das OP funktioniert) besteht darin, die /
von den Ziffern in zwei verschiedene Pfadausdrücke zu trennen, so dass das führende /
nicht in der tatsächlichen ID erfasst wird und scheitert nicht beim Parsen
Das {noop: (/)?}
erfasst das optionale /
. Und das {id: ((?<=/)\d+)?}
verwendet einen positiven Lookbehind und sagt, dass die Zahlen ( \d+
) sind nur dann erlaubt, wenn ein /
davor steht ( (?<=/)
). Dies ist notwendig, da /
optional ist. Wenn wir diese Behauptung nicht verwenden würden, wäre /myMethod123
erlaubt.
Hier finden Sie einen vollständigen Testfall mit Jersey Test Framework
%Vor%Hier ist die Abhängigkeit für den Test
%Vor% Für die Tests wäre es besser, einen Boxed Integer
anstelle von int
als Methodenparameter zu verwenden. Mit der ersten wäre es möglich, eine Nullprüfung durchzuführen, anstatt die standardmäßige 0
für das Primitiv zu erhalten.
Tags und Links java rest jersey jersey-2.0