uso sirve que parametros para modificador ejemplos java string spring annotations constants

sirve - xpath expression java



El código de Java no se compilará debido a que el atributo debe ser un error de expresión constante (1)

No puedo entender por qué lo siguiente no compilará. El error que el IDE me da es "El valor para el atributo de anotación RequestParam.defaultValue debe ser una expresión constante".

Mi proyecto involucra a Spring y Maven, y dice lo siguiente:

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); }

Estoy pensando que el error proviene de la conversión de Long to String, pero no sé cómo solucionarlo. Apreciaré cualquier ayuda, soy nuevo en las anotaciones y la primavera.


Las reglas de Java dicen que cuando tienes una anotación, y tiene un parámetro que espera un tipo primitivo (como un int ) o una String , el valor debe ser una expresión constante . [Esto no tiene nada que ver con Spring.] En términos generales, una expresión constante es aquella cuyo valor el compilador puede descifrar en tiempo de compilación. Sin embargo, hay reglas para lo que constituye una expresión constante. Estas reglas están en JLS 15.28 . Solo ciertos tipos de operaciones se pueden usar en una expresión constante. Una llamada a método, como Long.toString() , no es una de esas. Entonces usar eso hace que su expresión no sea una expresión constante, aunque parezca que debería ser. (Se lo parece a usted, porque sabe lo que hace Long.toString . Sin embargo, el compilador no mantiene un catálogo de todos los métodos para saber cuáles son métodos "constantes" cuyos valores se pueden calcular en tiempo de compilación).

Sin embargo, el ejemplo en el enlace muestra que se puede usar el operador + , incluso cuando uno de los argumentos no es una cadena y, por lo tanto, se llama implícitamente a un método toString() . Esto sugiere que puede hacer que las cosas funcionen así:

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

No lo he probado, sin embargo.