Spring AOP: comment obtenir les annotations de la méthode conseillée
J'aimerais mettre en œuvre la sécurité déclarative avec le Printemps/AOP et les annotations.
Comme vous le voyez dans l'exemple de code suivant, j'ai Restreint les Annotations avec le paramètre "allowedRoles" pour définir qui est autorisé à exécuter un conseillé de la méthode.
@Restricted(allowedRoles="jira-administrators")
public void setPassword(...) throws UserMgmtException {
//set password code
...
}
Maintenant, le problème est que mon Avis je n'ai pas accès à la définition des Annotations:
public Object checkPermission(ProceedingJoinPoint pjp) throws Throwable {
Signature signature = pjp.getSignature();
System.out.println("Allowed:" + rolesAllowedForJoinPoint(pjp));
...
}
private Restricted rolesAllowedForJoinPoint(ProceedingJoinPoint thisJoinPoint)
{
MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
Method targetMethod = methodSignature.getMethod();
return targetMethod.getAnnotation(Restricted.class);
}
La méthode ci-dessus renvoie toujours null (il n'y a pas d'annotations).
Est-il une solution simple pour cela?
J'ai lu quelque chose sur l'utilisation de l'AspectJ agent, mais je préfère ne pas utiliser cet agent.
OriginalL'auteur hugri | 2010-04-01
Vous devez vous connecter pour publier un commentaire.
Je suppose
@Restricted
est votre annotation. Si c'est le cas, assurez-vous d'avoir:dans votre annotation définition. Cela signifie que l'annotation est conservé lors de l'exécution.
OriginalL'auteur Bozho
À celui qui a encore des problème après modification de l'annotation de rétention de l'Exécution, vous pourriez avoir le même problème que j'avais: getMethod() retourne la méthode de l'interface au lieu de la mise en œuvre de la classe. Donc, si vous avez vos annotations dans la classe alors naturellement getAnnotations() sur l'interface de la méthode renvoie null.
La solution suivante a résolu ce problème:
et si vous le souhaitez, vous avez la possibilité de manipulation de l'interface annotations ici aussi.
Certains commentaires plus disponible ici:
l'obtention du modèle de méthode d'instance de ProceedingJoinPoint
Oleg
OriginalL'auteur Oleg
Même après la modification de la stratégie de rétention comme Bozho mentionné cet appel pour obtenir de l'annotation renvoie la valeur null:
Ce que j'ai trouvé est que vous devez lier l'annotation. Compte tenu de l'interface est déclarée comme ceci:
L'avis devra être déclaré comme ceci:
Ce que ce fait est lié à l'annotation du paramètre dans la signature de la méthode, restrictedAnnotation. La partie que je ne suis pas sûr de savoir comment il obtient le type d'annotation, il semble être basé sur le paramètre. Et une fois que vous avez l'annotation, vous pouvez obtenir les valeurs.
OriginalL'auteur Ryan K
Pourquoi ne pas simplement utiliser Printemps De Sécurité ? C'est une brève de mettre en œuvre et d'utilisation, je ne vois vraiment pas l'intérêt de perdre du temps à réinventer la roue.
OriginalL'auteur dakull
Avec Spring AOP si vous avez une situation comme
MyManagerImpl implements MyManager
la coupe transverse (pointcut) est appliqué à lainterface
méthode afinMethodSignature
décrit la méthode définie surMyManager
qui n'ont pas d'annotation. le seul moyen que j'ai trouvé pour résoudre ce problème est d'inspecter la classe de l'jp.getTarget()
objet et de récupérer de la méthode.OriginalL'auteur LordEru