Wie kann @QueryParam einen Parameter ohne Wert in einen booleschen Wert "false" übersetzen?

7

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?

    
lathspell 21.10.2015, 11:31
quelle

3 Antworten

5

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.

    
Cassio Mazzochi Molin 21.10.2015, 12:02
quelle
8
  

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 namens valueOf oder fromString , die ein einzelnes String-Argument akzeptiert (siehe zB Integer.valueOf(String) )
  •   
  • Verfügt über eine registrierte Implementierung von ParamConverterProvider JAX-RS-Erweiterung SPI, die eine ParamConverter -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.

%Vor%

Stellen Sie einfach sicher, dass der Anbieter registriert ist. Es ist meiner Meinung nach eine ziemlich saubere Lösung.

    
Paul Samsotha 21.10.2015 13:31
quelle
5

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.

    
Phoste 29.09.2016 09:42
quelle

Tags und Links