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

2022-09-01 01:59:38

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

我的项目涉及Spring和Maven,它具有以下几点:

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

我认为错误来自Long到String的转换,但我不知道如何解决它。我将不胜感激任何帮助,我是注释和春天的新手。


答案 1

Java 规则规定,当您有一个注释,并且它有一个需要基元类型(如 )或 a 的参数时,该值必须是常量表达式。[这与春天无关。粗略地说,常量表达式是编译器可以在编译时计算出其值的表达式。但是,对于构成常量表达式的内容,存在一些规则。这些规则在 JLS 15.28 中。在常量表达式中只能使用某些类型的运算。方法调用(如 )不是其中之一。因此,使用它会使你的表达式不是一个常量表达式,即使它看起来应该是一个常量表达式。(这对你来说就像它,因为你知道什么。但是,编译器不会保留所有方法的目录,以了解哪些是“常量”方法,其值可以在编译时找出。intStringLong.toString()Long.toString

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

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

不过,我还没有尝试过。


答案 2