在play-swagger模块中,我们使用play.routes.compiler.RoutesFileParser来从Play获取所有已注册的路由,并进一步将它们解析为API文档:
val parsedRoutes = RoutesFileParser.parse(new File(app.classloader.getResource(routesFile).toURI))
val routes = parsedRoutes.right.get.collect {
case (route: PlayRoute) => {
logger.debug(s"Adding route '$route'")
Seq(route.copy(path = route.path.copy(parts = StaticPart(prefix + "/") +: route.path.parts)))
}
case (include: PlayInclude) => {
logger.debug(s"Processing route include $include")
parseRoutesHelper(playRoutesClassNameToFileName(include.router), include.prefix)
}
}.flatten
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
java.lang.NoClassDefFoundError: play/routes/compiler/RoutesFileParser
似乎RoutesFileParser在Play中变得私密!2.5.
获取所有Play路线的正确方法是什么,如上例所示?
这个问题的主要目标是理解实现以及为什么会这样。当然,它的解决方案或解决方法也将受到高度赞赏......
给出这个例子:
enum class SomeEnum(val customProp: String) {
FOO("fooProp"),
BAR("barProp");
}
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.SOURCE)
annotation class TheAnnotation(
val targetValue: String
)
@TheAnnotation(targetValue = SomeEnum.FOO.customProp)
fun testFun() {
}
Run Code Online (Sandbox Code Playgroud)
编译结果出现以下错误:
SomeEnum.kt: (14, 30):注释参数必须是编译时常量
由于显而易见的原因,注释值(以及其他值)必须是编译时常量,这在许多不同方面都是有意义的。我不清楚的是为什么customProp编译器不将其视为常量。
如果枚举被定义为有限的、封闭的信息集,那么根据我的理解,它们应该只在编译时可变,即“编译时常量”。对于枚举在 Kotlin 运行时可以以某种方式进行修改的不太可能的情况,这也可以回答这个问题。
附录:
枚举值(例如SomeEnum.FOO)实际上被视为编译时常量。证据是,以下稍作修改的代码片段可以编译:
enum class SomeEnum(val customProp: String) {
FOO("fooProp"),
BAR("barProp");
}
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class TheAnnotation(
val targetValue: SomeEnum
)
@TheAnnotation(targetValue = SomeEnum.FOO)
fun testFun() {
}
Run Code Online (Sandbox Code Playgroud)