通过函数构建端点值-注释属性X的值必须为常量表达式

时间:2019-02-09 18:34:41

标签: java spring eclipse rest

我正试图通过函数构建的字符串构建端点值,如下所示:

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);
    }
}

如果可能的话,我该如何完成我想做的事情?如果不可能的话,还有其他方法可以达到类似的效果吗?

1 个答案:

答案 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不为空。

    •   
    • 如果TClass或调用Class,并且V是类文字(第15.8.2节)。

    •   
    • 如果T是枚举类型,而V是枚举常量。

    •   
  •   

本质上,仅编译时常量才允许用作注释元素的值。