Comment @QueryParam peut-il traduire un paramètre sans valeur en booléen «faux»?

J’aimerais utiliser une URL telle que http://www.example.com/rest/foo?bar où le paramètre de requête de la bar n’a pas de valeur et sa présence seule devrait indiquer si une variable est true ou false .

Actuellement, la valeur manquante est supposée être "" (vide) et transmise à new Boolean() qui la traite comme false .

Existe-t-il un moyen plus élégant de le définir que de déclarer le paramètre Ssortingng et de le convertir moi-même?

Par exemple, une classe javax.rs.BooleanFlag ou similaire?

Vous pouvez essayer ce qui suit:

 @GET @Path("/some-path") public Response myMethod(@Context HttpServletRequest request) { boolean isParameterPresent = request.getParameterMap().contains("bar"); ... } 

Mais les solutions présentées dans la réponse de peeskillet sont les moyens les plus intelligents pour y parvenir.

Je sais que c’est une vieille question mais j’ai eu le même problème.

Pour résoudre mon problème, j’ai utilisé Annotation @DefaultValue:

 @GET @Path("/path") public Response myMethod(@DefaultValue("true") @QueryParam("foo") boolean foo) { if (foo) { ... } } 

Ainsi, lorsque la requête contient le paramètre foo la valeur booléenne sera false et sinon, elle sera vraie. Cela montre le contraire de la réalité, mais si vous en êtes conscient, son utilisation est simple.

Note: en voyant la réponse de Phoste , j’irais avec sa solution. Je laisse cette réponse, car il y a encore quelques informations utiles ici.

Existe-t-il un moyen plus élégant de le définir que de déclarer le paramètre Ssortingng et de le convertir moi-même? Par exemple, une classe javax.rs.BooleanFlag ou similaire?

Si vous regardez le javadoc pour @QueryParam , vous verrez une liste d’options sur la manière de créer un type personnalisé pour utiliser une valeur @QueryParam (la même chose s’applique pour d’autres @XxxParam s également)

  • Avoir un constructeur qui accepte un seul argument Ssortingng
  • Avoir une méthode static nommée valueOf ou fromSsortingng qui accepte un seul argument Ssortingng (voir, par exemple, Integer.valueOf(Ssortingng) )
  • Disposer d’une implémentation enregistrée de ParamConverterProvider d’ ParamConverterProvider JAX-RS ParamConverterProvider qui renvoie une instance de ParamConverter capable d’une conversion “from ssortingng” pour le type.

Donc, de la première option, en théorie, vous devriez être capable de faire quelque chose comme

 public class Flag { private final boolean isPresent; public Flag(Ssortingng param) { isPresent = param != null; } public boolean isPresent() { return isPresent; } } 
 @GET public Ssortingng get(@QueryParam("bar") Flag bar) { if (bar.isPresent()) { return "bar is present"; } else { return "bar is not present"; } } 

Cela fonctionne maintenant lorsque l’indicateur de requête est présent. Mais quand ce n’est pas le cas, il agit comme n’importe quel autre type non primitif. c’est nul. Donc, l’appel à bar.isPresent donne un NPE. Testé avec fromSsortingng et valueOf avec le même résultat. Nous pourrions vérifier if (bar == null) , mais ce n’est pas mieux que d’utiliser simplement une chaîne et de vérifier si la chaîne est nulle. Ce n’est pas joli

Donc, la dernière option est ParamConverterProvider . Ce qui fonctionne réellement. Ci-dessous, la mise en œuvre.

 import java.lang.annotation.Annotation; import java.lang.reflect.Type; import javax.ws.rs.ext.ParamConverter; import javax.ws.rs.ext.ParamConverterProvider; import javax.ws.rs.ext.Provider; @Provider public class FlagParamConverterProvider implements ParamConverterProvider { @Override public  ParamConverter getConverter( Class rawType, Type genericType, Annotation[] annotations) { if (rawType != Flag.class) { return null; } return new ParamConverter() { @Override public T fromSsortingng(Ssortingng value) { return (T)new Flag(value); } @Override public Ssortingng toSsortingng(T value) { return null; } }; } } 

Assurez-vous simplement que le fournisseur est enregistré. C’est une solution assez propre à mon avis.