由于属性必须是常量表达式错误,Java代码将无法编译

我无法弄清楚为什么以下不会编译。 IDE给我的错误是“注释属性RequestParam.defaultValue的值必须是常量表达式”。

我的项目涉及Spring和Maven,它包括以下内容:

private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE); @RequestMapping(method=RequestMethod.GET) public List spittles( @RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING) long max, @RequestParam(value="count", defaultValue="20") int count) { return spittleRepository.findSpittles(max, count); } 

我认为错误来自Long转换为String,但我不知道如何解决它。 我会感谢任何帮助,我是注释和Spring的新手。

Java规则说,当你有一个注释,并且它有一个需要基本类型(如int )或String ,该值必须是一个常量表达式 。 [这与Spring无关。]粗略地说,常量表达式是编译器在编译时可以计算出来的值。 但是,有什么构成常量表达式的规则。 这些规则在JLS 15.28中 。 在常量表达式中只能使用某些类型的操作。 方法调用(例如Long.toString()不是其中之一。 所以使用它会使你的表达式不是一个常量表达式,即使它看起来应该是这样。 (它看起来像你,因为你知道Long.toString做了什么。但是,编译器没有保留所有方法的目录来知道哪些是“常量”方法,其值可以在编译时计算出来。)

但是,链接上的示例显示可以使用+运算符,即使其中一个参数不是字符串,因此隐式调用toString()方法。 这表明你可以使事情像这样工作:

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

不过我还没试过。