Предположит, объект контроллера, как это:Как получить аннотации методы в Scala 2,11
object Users extends Controller {
...
@ApiOperation(
httpMethod = "POST",
nickname = "authenticate",
value = "Authenticates an user",
notes = "Returns the JSON Web Token to be used in any subsequent request",
response = classOf[models.auth.api.Jwt])
def authenticate = SecuredAction[Users.type]("authenticate").async(parse.json) { implicit request =>
...
}
...
}
Как получить значение аннотаций методы authenticate
во время выполнения? Я попытался это:
def methodAnnotations[T: TypeTag]: Map[String, Map[String, Map[String, JavaArgument]]] = {
typeTag[T].tpe.declarations.collect { case m: MethodSymbol => m }.map { m =>
val methodName = m.name.toString
val annotations = m.annotations.map { a =>
val annotationName = a.tpe.typeSymbol.name.toString
val annotationArgs = a.javaArgs.map {
case (name, value) => name.toString -> value
}
annotationName -> annotationArgs
}.toMap
methodName -> annotations
}.toMap
}
methodAnnotations
возвращает указанную аннотацию для указанного метода и вызывать так:
val mAnnotations = methodAnnotations[T]
val nickname = mAnnotations("myMethodName")("MyAnnotationName")("myAnnotationMemberName").asInstanceOf[LiteralArgument].value.value.asInstanceOf[String]
Проблема заключается в том, что, когда я скомпилировать код выше, я всегда получаю следующее предупреждения:
type JavaArgument in trait Annotations is deprecated: Use `Annotation.tree` to inspect annotation arguments
method tpe in trait AnnotationApi is deprecated: Use `tree.tpe` instead
Каков правильный способ получить аннотации методов с помощью scala 2.11?
Я попробую ... но могу ли я спросить, почему Джексон лучше, чем отражение scala? только для информации ;-) – j3d
@ j3d Джексон широко используется, прочный, быстрый и чистый. Итак ... почему бы и нет, если он легко выполнит работу =)? Кроме того, API отражения Scala не дает вам доступа к параметрам аннотации без подглядывания (см. Http://stackoverflow.com/questions/26635223/scala-2-11-reflection-and-annotations-java-with-parameters/ 26637228 # 26637228). – Nate
Я пробовал ... но это не работает для меня, потому что 'SecuredAction' должен принимать параметр типа ... и переданный тип должен быть« объектом », полученным из' Controller' ... – j3d