scala注释参数需要为常量,但final val不允许为常量

scala注释参数需要为常量,但final val不允许为常量,scala,compiler-errors,annotations,Scala,Compiler Errors,Annotations,在这个片段中 @SwaggerDefinition(...authorizationUrl = SecurityConstants.authorizationUrl) 鉴于此 final object SecurityConstants { final val authorizationUrl: String =.. } (两次总决赛中只有一次还行,但仍然如此) 我曾期望/希望它能用2.12.3编译,但它却给了我很大的帮助 “注释参数必须是常量;找到:SecurityConstants

在这个片段中

@SwaggerDefinition(...authorizationUrl = 
SecurityConstants.authorizationUrl)
鉴于此

final object SecurityConstants {
  final val authorizationUrl: String =..
}
(两次总决赛中只有一次还行,但仍然如此) 我曾期望/希望它能用2.12.3编译,但它却给了我很大的帮助 “注释参数必须是常量;找到:SecurityConstants.authorizationUrl [错误]authorizationUrl=SecurityConstants.authorizationUrl,”

在注释中调用Java静态方法System.getenv(“a”)也会带来相同的错误,即

@SwaggerDefinition(...authorizationUrl = System.getenv("a"))
请帮忙,
Nicu M

final val
引用可以在两种情况下用作Java注释参数:

  • 分配给
    最终值的值必须是文字
  • 您必须明确指定
    最终val的类型
  • 因此,这将起作用:

    final val authorizationUrl = "http://something.com"
    
    但这些将不起作用:

    final val authorizationUrl = "http://something.com".trim
    final val authorizationUrl: String = "http://something.com"
    

    第2个条件可能看起来特别奇怪,但编译器需要在内部保留信息,即
    最终val
    不仅包含
    字符串,还包含某个特定的文本字符串值(编译器必须推断a)。

    final val authorizationUrl: String =..
    
    在Scala和Java中,注释参数必须是编译时的常量,而不仅仅是“final”。因此,直接或通过中间
    val
    执行
    System.getenv(“a”)
    (或任何其他函数调用)不会执行此操作,因为这不是编译时常量。这样做是因为注释被设计为在编译时可自省,即,如果您只有一个
    .class
    文件,则必须能够获得注释的所有字段的值。因此编译器必须在编译时知道所有的值

    更新


    实际上,Swagger本身依赖于编译时的内省。那么,您希望它对您的
    System.getenv
    调用有什么作用呢?Swagger应该为这种注释生成什么规范?你为什么需要它呢?如果您有多个环境,您应该将产品的URL(即外部用户访问的URL)放入定义中。

    没有
    授权URL
    ,其他部分似乎也有不同的键。你确定你在代码中使用了正确的密钥吗?@GáborBakos,我相信这里引用的内容与[OAuth2Definition]的一部分有关(