Ich möchte eine URL wie http://www.example.com/rest/foo?bar
verwenden, für die der Abfrageparameter bar
keinen Wert hat und deren Vorhandensein allein angeben sollte, wenn eine Variable true
oder false
ist.
Momentan wird angenommen, dass der fehlende Wert ""
(leer) ist und an new Boolean()
übergeben wird, was ihn als false
behandelt.
Gibt es eine elegantere Definition, als den Parameter als String zu deklarieren und ihn selbst zu konvertieren?
wie z.B. eine Klasse javax.rs.BooleanFlag
oder ähnlich?
Sie könnten Folgendes versuchen:
%Vor%Aber die Lösungen, die in Peeskillet's Antwort gezeigt werden, sind die klügsten Wege, dies zu erreichen.
Gibt es eine elegantere Definition, als den Parameter als String zu deklarieren und selbst zu konvertieren? Wie z.B. eine Klasse
javax.rs.BooleanFlag
oder ähnlich?
Kein solcher Typ ( BooleanFlag
), Wenn Sie sich die javadoc ansehen Für @QueryParam sehen Sie eine Liste mit Optionen, wie wir einen benutzerdefinierten Typ erstellen können, um einen @QueryParam
-Wert zu verwenden (meistens gilt das Gleiche auch für andere @XxxParam
s)
- Ein Konstruktor, der ein einzelnes String-Argument akzeptiert
- Haben Sie eine
static
-Methode namensvalueOf
oderfromString
, die ein einzelnes String-Argument akzeptiert (siehe zBInteger.valueOf(String)
)- Verfügt über eine registrierte Implementierung von
ParamConverterProvider
JAX-RS-Erweiterung SPI, die eineParamConverter
-Instanz zurückgibt, die für den Typ eine "from string" -Konvertierung ausführen kann.
In der Theorie sollten Sie in der Lage sein, etwas wie
zu tun %Vor% %Vor% Das funktioniert jetzt, wenn das Abfrage-Flag vorhanden ist. Aber wenn nicht, verhält es sich wie jeder andere nicht-primitive Typ; es ist null. Der Aufruf von bar.isPresent
gibt also eine NPE. Getestet mit fromString
und valueOf
mit dem gleichen Ergebnis. Wir könnten if (bar == null)
überprüfen, aber das ist nicht besser, wenn Sie nur einen String verwenden und prüfen, ob der String null ist. Es ist nicht schön .
Also ist die letzte Option ParamConverterProvider
. Was tatsächlich funktioniert. Unten ist die Implementierung.
Stellen Sie einfach sicher, dass der Anbieter registriert ist. Es ist meiner Meinung nach eine ziemlich saubere Lösung.
Ich weiß, es ist eine alte Frage, aber ich hatte die gleichen Probleme.
Um mein Problem zu lösen, habe ich die Annotation @DefaultValue:
verwendet %Vor% Wenn also die Anfrage den Parameter foo
enthält, ist der boolesche Wert falsch und wenn nicht, wird er wahr sein. Es zeigt das Gegenteil der Realität, aber wenn Sie sich dessen bewusst sind, ist es ziemlich einfach zu bedienen.