我有一个带有@Controller
注释方法的Spring 1 @RequestMapping
带注释的类。我想从另一个类引用@RequestMapping
参数value
和method
的值,而不是将它们硬编码到注释中。
而不是
@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
?
答案 0 :(得分:4)
我们需要看一下Java语言规范所说的an acceptable value for an annotation method。
如果元素类型不相称,则为编译时错误 与元素值。元素类型
T
与a相称 元素值V
当且仅当满足下列条件之一时:
- 如果
T
是基本类型或String
,则V
是常量表达式(第15.28节)。- 如果
T
是enum
类型(§8.9),则V是enum
常量(§8.9.1)。
PATH_METHOD
不是enum
constant。 RequestMethod.GET
是enum
常量。对于String
,这个
public static final String PATH = "my/path";
是一个常量变量,它是一个常量表达式,因此可以使用。
即使在同一文件中声明了常量,它也不应该工作。请查看。