@RequestParam 注解 attribute value must be a constants
如下代码所示: 我在利用@RequestParam 为max参数设置默认值MAX_LONG_AS_STRING 得实惠,产生了一个错误attribute value must be a constants
private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE);
@RequestMapping(value = "latestBlogs",method = RequestMethod.GET)
public List<Blog> blogs(@RequestParam(value = "max",defaultValue = MAX_LONG_AS_STRING ) long max,
@RequestParam(value = "count",defaultValue = "20")int count){
return blogRepository.findBlogs(max,count) ;
}
MAX_LONG_AS_STRING 明明为常量,为什么还是提示attribute value must be a constants 呢?
首先有两个概念,运行时常量和编译时常量
- 运行时常量,运行时确定的常量值。
- 编译时常量,即在编译时就能确定的常量值。
编译时常量值,什么是 ** Compile-time Constant **
1. 原始类型字面量,或者String字面量 2. 能转型为原始类型字面量,或String字面量的常量 3. 一元运算符(+,-,~,!,但不包含++, --) 和1,2组成的表达式 4. 多元运算符(*,/和%)和1,2组成的表达式 5. 附加运算符( additive operators) (+ 或 -)与之前几条组成的表达式 6. 位移运算符(<<,>>, >>>)和之前几条组成的表达式 7. 关系运算符(<,<=,>,>= ,不包括 instanceof)与之前几条组成的表达式 8. 关系运算符(==,!=)与之前几条组成的表达式 9. 位运算符(&, ^, |)与之前几条组成的表达式 10. 条件与和条件或运算符(&&, ||) 与之前几条组成的表达式 11. 三元运算符 (?:)和之前几条组成的表达式 12. 带括号的表达式,括号内也是常量表达式 13. 引用常量变量的简单变量 [§6.5.6.1](https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.5.6.1) 14. 类中的常量变量引用,使用类的全限定名或类名进行引用(String.class)
RequestParam的defaultValue很明显需要设置为编译时常量值,而Long.toString(Long.MAX_VALUE)是不满足上面14种情况中的任何一种的。
