实用工具
public class GeneralUtils {
public static String getUrlWithId(String urlsPartStr) {
// Get a relative URL like /delete/{id} .
String result = String.format("%s/{id}", urlsPartStr);
return result;
}
}
UrlsParts
public class UrlsParts {
public static final String delete = "/delete";
public static final String deleteById = GeneralUtils.getUrlWithId(delete);
}
主计长
@PostMapping(UrlsParts.deleteById)
public String delete(@PathVariable Integer id,
Model model) {
authorRepository.deleteById(id);
return "redirect:" + Urls.AUTHORS_LIST.getHref();
}
仅供参考:这是Spring。但无论如何,问题是关于核心Java的。
错误
Attribute value must be constant
问题
我尽量不在注解中硬编码字符串。在上一个视频中有一个部分解决方案。但是,坦率地说,我失败得很惨。
你能帮助我吗?任何解决方案都适合我(枚举等)。
1条答案
按热度按时间ffx8fchx1#
正如错误消息所说,注解的参数必须是常量表达式。您可以在JLS中看到“常量”表达式的定义:
常量表达式是表示基元类型值或不突然完成的
String
的表达式然后,它继续列出常量表达式的必要和充分条件。下面是一些相关的条件:
(常量表达式)仅使用以下内容组成:
+
和-
(§15.18)一个“常量变量”是(4.12.4节):
一个
final
原始类型或String
类型的变量,用常量表达式初始化(§15.29)。值得注意的是,方法调用不是常量表达式,一个原因是方法可能“突然完成”,例如抛出异常。
因此,
deleteById
不是常量变量,因此表达式deleteById
也不是常量表达式。另一方面,表达式
delete + "/{id}"
* 是 * 常数表达式,因为delete
和"/{id}"
是常数表达式,并且应用于常数表达式的+
也是常数表达式。我建议声明一个名为
byId
的独立常量,如果你不想重复写"/{id}"
的话。或者直接使用
delete + byId
作为注解参数。