Spring AOP à la Couche de Service
J'ai besoin d'aide avec Spring AOP.
J'ai le code suivant:
@Service
public class UserSecurityService implements UserDetailsService {
@Autowired
private UserService userService;
....
}
@Service
public class UserService extends CrudService<User, UserRepository> {
public UserService() {
super();
}
@Autowired
public UserService(UserRepository repository) {
super(repository);
this.repository = repository;
}
....
}
@Repository
interface UserRepository extends JpaRepository<User, String> {
...
}
application-context.xml
<import resource="classpath*:spring/application-context-db.xml" />
<import resource="classpath*:spring/application-context-aop.xml" />
<import resource="classpath*:spring/application-context-mail.xml" />
<import resource="application-context-security.xml" />
<context:component-scan base-package="com.xpto">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
</context:component-scan>
application-context-aop.xml
<aop:aspectj-autoproxy />
<aop:config>
<aop:aspect id="serviceLoggingAspect" ref="serviceLoggingAspectBean">
<aop:pointcut id="servicePointcut"
expression="@within(org.springframework.stereotype.Service)" />
<aop:before method="before" pointcut-ref="servicePointcut" />
<aop:after-returning method="afterReturning" pointcut-ref="servicePointcut" returning="result" />
<aop:after-throwing method="afterThrowing" pointcut-ref="servicePointcut" throwing="exception" />
</aop:aspect>
</aop:config>
Quand j'essaye de charger mon application sur Tomcat, j'obtiens l'exception suivante:
Caused by: java.lang.IllegalArgumentException: Can not set com.xpto.user.service.UserService field com.xpto.user.security.service.UserSecurityService.userService to com.sun.proxy.$Proxy57
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:680)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:510)
... 35 more
J'ai la même configuration Web de la couche de l'enregistrement de ma demande et il fonctionne très bien, mais quand je mets de l'AOP à la couche de Service-je obtenir cette exception.
Je suis à l'aide de Spring MVC et à web.xml je l'ai configuré pour charger deux contextes différents, l'un se charge seulement de @Contrôleur et les autres charges @Référentiel et @Service.
OriginalL'auteur Celso Marques | 2013-08-21
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas l'injection d'une interface si vous avez besoin d'utiliser CGLIB des procurations, le manuel de référence-printemps états:
Printemps a décidé d'utiliser J2SE proxy (
com.sun.proxy.$Proxy57
) probablement parce queCrudService
implémente une interface. Pour forcer l'utilisation de CGLIB vous pouvez modifier votre XML:(*je ne sais pas) Quand je quitte le Référentiel avec par défaut modificateur d'accès - je obtenir cette exception: Causés par: org.springframework.aop.cadre.AopConfigException: impossible de générer CGLIB sous-classe de la classe [classe com.xpto.de l'utilisateur.service.$Proxy54]: les causes les plus Courantes de ce problème consiste à utiliser un final de classe ou d'un non-visible de la classe; nested exception java.lang.IllegalArgumentException: Ne sous-classe dernière classe com.xpto.de l'utilisateur.service.$Proxy54 je pense que l'exception se produit en raison d'un défaut d'accès de UserRepository interface. Merci
OriginalL'auteur samlewis
@samlewis: Cette phrase que vous avez écrit m'a poussé à créer des interfaces de mes Services, et quand je l'ai fait, LoggingAspect travaillé vraiment bien. Donc, je ne suis pas en utilisant proxy-cible class=true.
Merci beaucoup pour votre temps.
OriginalL'auteur Celso Marques