编译器说注释的值必须是常数"

时间:2014-11-10 21:50:16

标签: java annotations java-8

我有一个带有@Controller注释方法的Spring 1 @RequestMapping带注释的类。我想从另一个类引用@RequestMapping参数valuemethod的值,而不是将它们硬编码到注释中。

实施例

而不是

@Controller
public class MyController {
    @RequestMapping(value="my/path", method=RequestMethod.GET)
    public String handlePath() {
        // etc...
    }
}

我想要两个文件,

@Controller
public class MyController {
    @RequestMapping(value=Constants.PATH, method=Constants.PATH_METHOD)
    public String handlePath() {
        // etc...
    }
}

public class Constants {
    public static final String PATH = "my/path";
    public static final RequestMethod PATH_METHOD = RequestMethod.GET;
}

不幸的是,这会因以下编译时错误而失败:

error: an enum annotation value must be an enum constant
        @RequestMapping(value=Constants.PATH, method=Constants.PATH_METHOD)
                                                              ^

问题

为什么这适用于String,但不适用于enum


注释

  1. 这个问题不是针对Spring的,这只是这个问题的一个(希望)可访问的例子。
  2. 我碰巧使用Java 8

1 个答案:

答案 0 :(得分:4)

我们需要看一下Java语言规范所说的an acceptable value for an annotation method

  

如果元素类型不相称,则为编译时错误   与元素值。元素类型T与a相称   元素值V当且仅当满足下列条件之一时:

     
      
  • 如果T是基本类型或String,则V是常量表达式(第15.28节)。
  •   
  • 如果Tenum类型(§8.9),则V是enum常量(§8.9.1)。
  •   

PATH_METHOD不是enum constantRequestMethod.GETenum常量。对于String,这个

public static final String PATH = "my/path";

是一个常量变量,它是一个常量表达式,因此可以使用。

即使在同一文件中声明了常量,它也不应该工作。请查看。