【问题标题】:Building endpoint values from a function - The value for annotation attribute X must be a constant expression从函数构建端点值 - 注释属性 X 的值必须是常量表达式
【发布时间】:2019-07-03 16:44:36
【问题描述】:

我正在尝试从由函数构建的字符串构建端点值,如下所示:

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

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

【问题讨论】:

  • 你的问题是......?

标签: java spring eclipse rest


【解决方案1】:

这是不可能的。来自JLS, §9.7.1

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

  • T是一个数组类型E[],或者:

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

    • V 是一个与E 相称的元素值。

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

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

    • V 不为空。

    • 如果TClass,或者Class 的调用,并且V 是一个类文字(§15.8.2)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多