2017-12-08 3 views
1

In diesem Snippet machen,scala Annotation Argument muss konstant sein, aber endgültige val ist es nicht

@SwaggerDefinition(...authorizationUrl = 
SecurityConstants.authorizationUrl) 

und da

final object SecurityConstants { 
    final val authorizationUrl: String =.. 
} 

(nur eines der beiden Endspiele ok sein sollte, aber immer noch) Ich hatte erwartet/gehofft, dass dies mit 2.12.3 kompilieren würde aber es gibt "Annotation Argument muss eine Konstante sein; gefunden: SecurityConstants.authorizationUrl [Fehler] authorizationUrl = SecurityConstants.a uthorizationUrl“

Auch Aufruf Java statische Methode System.getenv ("a") in Annotation den gleichen Fehler bringt, ist, dass

@SwaggerDefinition(...authorizationUrl = System.getenv("a")) 

Bitte helfen, Nicu M

+0

http://docs.swagger.io/swagger-core/current/apidocs/io/swagger/annotations/ApiKeyAuthDefinition.html hat keine 'authorizationUrl' und andere Teile scheinen auch andere Schlüssel zu haben. Sind Sie sicher, dass Sie den richtigen Schlüssel im Code verwenden? –

+0

@ GáborBakos, ich glaube, was hier referenziert ist, ist verwandt mit [OAuth2] (https://swagger.io/docs/specification/authentication/oauth2/) dh ein Teil von [OAuth2Definition] (http: //docs.swagger. io/swagger-core/aktuelle/apidocs/io/swagger/Anmerkungen/OAuth2Definition.html – SergGr

Antwort

1

final val Hinweise kann sein wird als Annotationsargument unter zwei Bedingungen verwendet:

  1. Der Wert final val muss ein Literal sein.
  2. Sie müssen nicht den Typ Ihres final val explizit angeben.

Also, das funktioniert:

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

aber diese werden nicht Arbeit:

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

die Bedingung nicht. 2 kann besonders seltsam erscheinen, aber es ist für den Compiler erforderlich, um intern die Informationen behalten, dass die final val hält nicht nur einen String aber einig bestimmte Zeichenkette Wert.

0

Es ist wirklich wichtig, was sich hinter .. im Annotation-Argumente müssen nur

final val authorizationUrl: String =.. 

In Scala und Java ist "final" als Kompilierung- Konstanten eher sein. So System.getenv("a") (oder jeder anderer Funktionsaufruf) direkt oder über Zwischen val wird es nicht tun, da dies keine konstante Übersetzungszeit ist. Dies wird so gemacht, weil Anmerkungen entworfen werden an der Kompilierung introspectable sein heißt, wenn Sie nur eine .class Datei haben, Sie müssen in der Lage sein, den Wert aller Felder der Anmerkung zu bekommen. Der Compiler muss also alle Werte zur Kompilierzeit kennen.

aktualisieren

Eigentlich Swagger selbst beruht auf der Kompilierung-Selbstbeobachtung. Was genau hast du erwarten Sie es mit Ihrem System.getenv Anruf zu tun? Welche Spezifikation sollte Swagger für eine solche Annotation generiert haben? Und warum brauchst du es überhaupt? AFAIU, wenn Sie mehrere Umgebungen haben, sollten Sie URLs der Produktion (das heißt, die eine von externen Benutzern zugegriffen wird) in die Definition setzen.

Verwandte Themen