2014-02-10 7 views
9

Ich habe Spring AOP nie verwendet und versuche, meine erste Bean zu konfigurieren. Es scheint, dass ich es richtig konfiguriert habe, aber ich bekomme eine Ausnahme, dass die Bean nicht gefunden wird.java.lang.IllegalArgumentException: Warnung keine Übereinstimmung für diesen Typ Name: ru.sbt.filial.cards.aspect.SomeBean [Xlint: invalidAbsoluteTypeName]

Mein Aspekt ist -

@Aspect 
@Component 
public class IdentificationAspect { 

    @Before("execution(* ru.sbt.filial.cards.aspect.SomeBean.*(..))") 
    public void logBefore(JoinPoint joinPoint) throws Throwable { 

     System.out.println("logBefore() is running!"); 
     System.out.println("hijacked : " + joinPoint.getSignature().getName()); 
     System.out.println("******"); 
    } 
} 

Und meine Bohne, die AOP finden nicht ist -

package ru.sbt.filial.cards.aspect; 

import org.springframework.stereotype.Component; 

@Component 
public class SomeBean { 

    public void printSmth() { 
     System.out.println("!!!!!!!!!!!"); 
    } 

} 

Ich habe die folgende Ausnahme bekam -

Caused by: java.lang.IllegalArgumentException: warning no match for this type name: ru.sbt.filial.cards.aspect.SomeBean [Xlint:invalidAbsoluteTypeName] 
       at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301) 
       at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207) 
       at org.springframework.aop.aspectj.AspectJExpressionPointcut.getFallbackPointcutExpression(AspectJExpressionPointcut.java:358) 
       at org.springframework.aop.aspectj.AspectJExpressionPointcut.matches(AspectJExpressionPointcut.java:255) 
       at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:208) 
       at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:262) 
       at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:294) 
       at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:117) 
       at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:87) 
       at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:68) 
       at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:356) 
       at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:319) 
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:412) 
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1629) 
       at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:162) 
       ... 165 more 

Ich habe folgende maven Abhängigkeiten -

Und meine Feder applicationContext.xml Konfiguration ist -

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://www.springframework.org/schema/mvc 
       http://www.springframework.org/schema/mvc/spring-mvc.xsd 
         http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.2.xsd 
         http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

<mvc:annotation-driven/> 
<aop:aspectj-autoproxy/> 

<bean id="someBean" class="ru.sbt.filial.cards.aspect.SomeBean"> 
</bean> 

UPDATE ich meine Spring-Konfigurationszeile hinzugefügt

<context:component-scan base-package="ru.sbt.filial.cards.aspect"/> 

aber immer noch dieselbe Nachricht. Ich habe auch versucht, verschiedene Möglichkeiten, um mit Anmerkungen versehen - wenn ich die Bohne heißt Schreib nicht angeben -

@Before("execution(* ru.sbt.filial.cards.aspect.*.*(..))") 

statt

@Before("execution(* ru.sbt.filial.cards.aspect.SomeBean.*(..))") 

Ich habe keinen Fehler beim Laden, aber AOP Methode wird nicht aufgerufen.

Ich versuchte auch, wie diese

@Before("this(ru.sbt.filial.cards.aspect.SomeBean) and execution(* printSmth(..))") 

aber mit dem gleichen Ergebnis zu annotieren - keine Übereinstimmung für diesen Namen. Noch mehr Ideen ??

+0

Sie vermißt, Bean IdentificationAspect in der Konfigurationsdatei – Rembo

+0

hinzufügen, noch funktioniert es nicht? – Rembo

Antwort

0

Um

<context:component-scan base-package="ru.sbt.filial.cards.aspect"/> 

Wie Sie @Component Anmerkung in SomeBean Klasse verwendet

Update erfolgreich, in Ihrem Frühjahr applicationContext.xml Konfigurationsdatei hinzufügen ausführen:

Versuch durch Zugabe von Methodennamen zu @Before :

@Before("execution(* ru.sbt.filial.cards.aspect.SomeBean.logBefore(..))") 
+0

Ich habe hinzugefügt, aber immer noch die gleiche Nachricht. Ich habe auch versucht, verschiedene Möglichkeiten zu kommentieren - wenn ich nicht den Bean-Namen gebe - –

12

Ich habe den gleichen pr oblem wie du und ich habe meins gelöst. Ich gebe dir zwei Vorschläge, du kannst es ausprobieren. Bitte ändern Sie die @Before Anmerkung im Aspekt Klasse als eine der folgenden Möglichkeiten:

@Before("execution(* ru.sbt.filial.cards.aspect.SomeBean.logBefore(..))")

oder

@Before("execution(* ru.sbt.filial.cards.aspect.SomeBean..*(..))")

Hoffe, es hilft.

+3

Für mich, änderte von ". *" Zu ".. *" das Problem, das ich bei der Bereitstellung in JBoss 7 hatte. Aber können Sie erklären, warum "..*" wird gebraucht? (". *" hat in meinen Standalone-Unit-Tests gut funktioniert) – caprica

+1

@caprica Ich denke, das erste "." ist ein Punkt selbst, aber der zweite "." ist ein Platzhalter, der mit einem beliebigen Zeichen übereinstimmt und "*" bedeutet, dass eine beliebige Zahl gefunden wird. Also 'SomeBean .. * (..)' bedeutet, dass alle Methoden von 'SomeBean' wie' SomeBean.methodA (..) 'oder' SomeBean.methodB (..) 'übereinstimmen. – CDT