À l'aide de @Autocâblés avec AspectJ et Springboot
Je veux utiliser @Autocâblés annotation dans un "Aspect". Je veux injecter un référentiel dans mon aspect, mais quand j'essaie d'appeler une méthode de mon autocâblés classe un NullPointException se produit.
@Aspect
public class AspectSecurity {
@Autowired
private UserRepository userRepository;
@After("execution(public * dash.*.*Controller.*(..))")
public void authentication(JoinPoint jp) throws UnauthorizedException {
System.out.println("SECURITY !");
System.out.println(userRepository.findAll().toString());
}
}
J'ai déjà essayé d'ajouter @Component
au-dessus de mon aspect de la Classe, mais j'ai la même erreur.
Si je n'utilise pas un aspect de la classe, mais un @Controller
je peux appeler mes référentiel sans problèmes.
Certains documents parlent de configuration spring avec des fichiers xml, mais avec spring boot je n'ai pas ces fichiers.
Voici une partie de mon pom.xml qui appel la aspectJ plugin:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>1.6</source>
<target>1.6</target>
<Xlint>ignore</Xlint>
<complianceLevel>${compiler.version}</complianceLevel>
<encoding>UTF-8</encoding>
<verbose>false</verbose>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
Ici ma classe d'Application:
package dash;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Ici le Contrôleur de classe dont l'aspect est appelé:
package dash.user;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import dash.GenericController;
@Controller
@RequestMapping("/user")
public class UserController extends GenericController {
@Autowired
private UserRepository repository;
@RequestMapping("/findAll")
public @ResponseBody User create(
@RequestParam(value="login", required=true) String login,
@RequestParam(value="password", required=true) String password) {
System.out.println(login);
System.out.println(password);
System.out.println("Users found with findAll():");
System.out.println("-------------------------------");
for (User user : repository.findAll()) {
System.out.println(user);
}
return repository.findOne("root");
}
}
Note: j'ai déjà essayé d'ajouter @EnableAspectJAutoProxy
au-dessus de ma classe d'application
merci pour votre aide
Avez-vous essayé d'ajouter
@Configurable
à l'aspect de la classe?L'aspect est utilisée "après" la "créer" la méthode. Il n'y a pas de logique de nommage. C'est juste un POC. Selon l'aspect de l'expression
@After("execution(public * dash.*.*Controller.*(..))")
l'aspect est appelée pour toutes les méthodes publiques ayant "Contrôleur" à la fin du nom dans toutes les classes de tous les packages du package "tableau de bord" ^^J'ai juste essayé d'ajouter
@Configurable
au-dessus de la déclaration de mon aspect de la classe, mais j'ai le même résultat. Pourriez-vous me donner quelques explications sur le pourquoi vous voulez ajouter @Configurable ?
OriginalL'auteur maxiplay | 2014-01-25
Vous devez vous connecter pour publier un commentaire.
C'est assez difficile à définir AspectJ tissage quelques choses qui pourraient être mal ici. Je voudrais suggérer que vous ne pas utilisation
@Component
sur votre@Aspect
(ou au moins faire en sorte qu'il est exclu d'une@ComponentScan
). La raison en est que vous devez créer un@Bean
de ce type et explicitement utiliser le même mécanisme de création que AspectJ ne, de sorte que le Printemps et l'AspectJ d'accord sur la valeur de l'instance du singleton. Je crois que la bonne façon de le faire est d'utiliser la statique des méthodes pratiques dansAspects
dans votre@Bean
définition. E. g.En outre, vous aurez besoin d'un
aop.xml
pour s'assurer que l'compilé aspect est sur le AspectJ weaver chemin. Il se pourrait que est ce que vous faites avec le Maven AspectJ plugin, mais si c'était à moi de faire cela, j'aurais probablement juste de créer unaop.xml
manuellement, utilisez@EnableLoadTimeWeaving
, et virer le plugin. Vous pouvez probablement vous décidez vous-même basé sur ce qui fonctionne.Il peut aussi y avoir du cycle de vie des problèmes si l'aspect doit intercepter quelque chose qui est utilisé lors de la construction du contexte de l'application. Vous pouvez peut-être éviter que, en ne s'appuyant pas sur une interception dans
@Bean
méthodes, ou bien vous vous retrouvez à jouer à des jeux avec@DependsOn
pour essayer de le forcer un ordre particulier de haricot de la création. Si votre application souffre de ça pour l'instant je ne peux pas dire.PRÉCÉDEMMENT (obsolète avec le Printemps de Démarrage 1.3):
Une autre pierre d'achoppement est que vous êtes à l'aide de Printemps de Démarrage et
@EnableAutoConfiguration
qui change explicitement sur@EnableAspectJAutoProxy
, et qui passe au large de la AspectJ tissage pour le Printemps bean aspects. En fait, j'ai aucune idée si c'est un effet secondaire de@EnableAspectJAutoProxy
, mais vous pouvez la désactiver en l'excluant de la configuration automatique, par exemple,N. B. vous pourriez ne pas remarquer que le tissage est éteint, si vous oubliez d'exclure cette config parce que le Printemps va créer des proxys pour vous et beaucoup de vos aspects tout fonctionne de toute façon.
spring.aop.auto=false
OriginalL'auteur Dave Syer
Voici ma configuration:
Il peut bien fonctionner.
OriginalL'auteur conanzhang