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

标签 java string spring annotations constants

我无法弄清楚为什么以下内容无法编译。 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 的转换,但我不知道如何解决它。我将不胜感激任何帮助,我是注释和 Spring 的新手。

最佳答案

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

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

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

不过我还没试过。

关于由于属性必须是常量表达式错误,Java 代码无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39157370/

相关文章:

java - 获取 spring oauth2 的身份验证提供程序

java - 如何将逗号分隔的字符串转换为字符串,每个字符串都用单引号括起来并用逗号分隔

java - 在 Eclipse STS 中启用 *.properties 的内容辅助

ruby - 转换已经用 UTF-8 编码的 ruby​​ 字符串中的 unicode 字符

c# - 如何存储字符串的字母

java - 为什么Spring在bean实例化失败的情况下还要继续初始化context?

java - 收到错误 - java.lang.ClassCastException : org. openqa.selenium.chrome.ChromeDriver 无法转换为 com.initialization.DriverInitialization

java - java中继承的类也是从Object类继承的吗?

java - 超过文本框大小的字符 validator

java - 如何让 Java 8 Nashorn 变快?