java - 从函数构建端点值 - 注释属性 X 的值必须是常量表达式
问题描述
我正在尝试从由函数构建的字符串构建端点值,如下所示:
ManagerController.java
@Controller
@RequestMapping(value = "/manager/")
public class ManagerController {
@Autowired
Manager manager;
public String endpointBuilder(String str) {
return "storage/" + str;
}
public String storeEndpoint = endpointBuilder("{store}");
@PostMapping(value = storeEndpoint)
private ResponseEntity<?> storeSomething(String str) {
manager.storeSomething(str);
return new ResponseEntity<>(CREATED);
}
}
该行@PostMapping(value = storeEndpoint)
导致错误The value for annotation attribute PostMapping.value must be a constant expression
。我正在处理的一个项目有大量相似的端点名称,并且可以从我能够使用中受益endpointBuilder()
,尤其是在 REST 控制器及其单元测试之间保持名称一致,但我一直在弄清楚如何使它工作. 下面给出了这个示例代码的其余部分。
应用程序.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
管理器.java
@Component
public class Manager {
private List<String> storage;
@Autowired
public Manager() {
this.storage = new ArrayList<String>();
}
public void storeSomething(String str) {
storage.add(str);
}
}
如果可能的话,我该如何完成我想做的事情?如果不可能,是否有替代方法可以达到类似的效果?
解决方案
这不可能。来自JLS,§9.7.1:
当且仅当以下条件之一为真时,元素类型
T
与元素值相称:V
T
是一个数组类型E[]
,并且:
V
是一个 ElementValueArrayInitializer 并且每个 ElementValue(类似于数组初始值设定项中的 VariableInitializer)V
都与E
; 或者
V
是一个与 相称的 ElementValueE
。的类型与
V
的赋值兼容(第 5.2 节)T
,此外:
If
T
是原始类型或String
, 并且V
是常量表达式(第 15.28 节)。
V
不为空。If
T
is或, andClass
的调用是类文字(第 15.8.2 节)。Class
V
If
T
是枚举类型,并且V
是枚举常量。
本质上,只允许编译时常量作为注释元素的值。
推荐阅读
- node.js - 在 Microsoft Luis 中,如何为实体数组建模?
- python-3.x - Python中的欧拉方法实现给出了稳定的结果,但它应该是不稳定的
- vim - 如何在垂直拆分中打开标签?
- java - OnClickListener 只激活一次
- javascript - 仅使用 vanilla javascript 从 div 上的外部实时加载文件调用 javascript 函数
- python - Python多处理,使用对象在进程之间共享数据
- python - 如何使用 Python 转义特定 .csv 列中的所有单双引号?
- plot - 从两组值做直方图(Julia 0.6.4)
- c# - ASP NET C#:如何从具有多个级别的 SDK 中检索值
- c# - 获取相对于旋转Unity3d的轴