我正试图通过函数构建的字符串构建端点值,如下所示:
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控制器及其单元测试之间保持名称统一,但是我仍然想弄清楚如何使其工作。下面是该示例代码的其余部分。
Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Manager.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);
}
}
如果可能的话,我该如何完成我想做的事情?如果不可能的话,还有其他方法可以达到类似的效果吗?
答案 0 :(得分:1)
不可能。来自JLS, §9.7.1:
当且仅当满足以下条件之一时,元素类型
T
与元素值V
相称:
T
是数组类型E[]
,并且可以是:
V
是一个ElementValueArrayInitializer,V
中的每个ElementValue(类似于数组初始化程序中的VariableInitializer)都与E
相称;或
V
是与E
相称的ElementValue。
V
的类型与T
是分配兼容的(§5.2),并且:
如果
T
是原始类型或String
,并且V
是常量表达式(第15.28节)。
V
不为空。如果
T
是Class
或调用Class
,并且V
是类文字(第15.8.2节)。如果
T
是枚举类型,而V
是枚举常量。
本质上,仅编译时常量才允许用作注释元素的值。