web-dev-qa-db-fra.com

Java ne sera pas compilé car attribut doit être une erreur d'expression constante

Je n'arrive pas à comprendre pourquoi ce qui suit ne compile pas. L'erreur que me donne IDE) est "La valeur de l'attribut d'annotation RequestParam.defaultValue doit être une expression constante".

Mon projet implique Spring et Maven, et il va comme suit:

private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE);

@RequestMapping(method=RequestMethod.GET)
public List<Spittle> spittles(
        @RequestParam(value="max",
                    defaultValue=MAX_LONG_AS_STRING) long max,
        @RequestParam(value="count", defaultValue="20") int count) {
    return spittleRepository.findSpittles(max, count);
}

Je pense que l'erreur provient de la conversion de Long en String, mais je ne sais pas comment la réparer. J'apprécierai toute aide, je suis nouveau aux annotations et au printemps.

Les règles Java indiquent que lorsque vous avez une annotation et qu’il a un paramètre qui attend un type primitif (tel que int) ou String, la valeur doit être une expression constante . [Cela n'a rien à voir avec Spring.] En gros, une expression constante est celle dont le compilateur peut comprendre la valeur Au moment de la compilation, il existe cependant des règles sur ce qui constitue une expression constante. Ces règles sont définies dans JLS 15.28 . Seuls certains types d’opérations peuvent être utilisés dans une expression constante. Un appel à une méthode, tel que Long.toString() n'est pas un de ceux-là, donc utiliser cela fait que votre expression n'est pas une expression constante, même si elle y ressemble Cela devrait vous ressembler, car vous savez ce que fait Long.toString. Cependant, le compilateur ne garde pas un catalogue de toutes les méthodes pour savoir lesquelles sont des méthodes "constantes" dont les valeurs peuvent être figurées à la compilation.)

Cependant, l'exemple sur le lien montre que l'opérateur + Peut être utilisé, même si l'un des arguments n'est pas une chaîne et qu'une méthode toString() est donc appelée implicitement. Cela suggère que vous pourriez peut-être faire fonctionner les choses comme ceci:

private static final String MAX_LONG_AS_STRING = "" + Long.MAX_VALUE;

Je n'ai pas essayé, cependant.

53
ajb