首页 > 解决方案 > 从函数构建端点值 - 注释属性 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);
    }
}

如果可能的话,我该如何完成我想做的事情?如果不可能,是否有替代方法可以达到类似的效果?

标签: javaspringeclipserest

解决方案


这不可能。来自JLS,§9.7.1

当且仅当以下条件之一为真时,元素类型T与元素值相称:V

  • T是一个数组类型E[],并且:

    • V是一个 ElementValueArrayInitializer 并且每个 ElementValue(类似于数组初始值设定项中的 VariableInitializer)V都与E; 或者

    • V是一个与 相称的 ElementValue E

  • 的类型与V的赋值兼容(第 5.2 节)T,此外:

    • IfT是原始类型或String, 并且V是常量表达式(第 15.28 节)。

    • V不为空。

    • If Tis或, andClass的调用是类文字(第 15.8.2 节)。ClassV

    • IfT是枚举类型,并且V是枚举常量。

本质上,只允许编译时常量作为注释元素的值。


推荐阅读