2014-09-12 3 views
1

나는 누군가가 나를 도울 수 있기를 정말로 바란다. 나는 웹 애플리케이션에서 아주 간단한 AOP 연산을 만들려고 노력하고있다. 불행히도 전혀 트리거되지 않습니다. 여기 내 CONFIGS : web.xml을 AOP/Aspectj, 봄 (4.0.5)에서 spring webapplication이 작동하지 않는다. 테스트에서

<!--application.xml--> 
<aop:aspectj-autoproxy proxy-target-class="true" /> <!-- i tried with and without proxy--> 
<bean id="config" class="com.whatever.config.Configuration"/> <!-- beans are not definend in application.xml, but in a separate class--> 

는 config 클래스

@Configuration 
@PropertySource({ "classpath:/ui.properties" }) 
@Import({ somclass.class, ScanBean.class}) 
public class Configuration { 

} 

scanbean

<!-- web.xml --> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/application*.xml</param-value> 
</context-param> 

그리고 application.xml을을 (application.xml을로드) 등급

@Configuration 
@ComponentScan(basePackages = { "com.ui.common", "com.ui.aspects" }) 
public class ScanBean { 

    @Bean 
    public DefaultEntityServiceAspect defaultEntityServiceAspect() { 
    return new DefaultEntityServiceAspect(); 
    } 
} 

콩은 모두 오류없이 시작됩니다. 가로 세로 콩 ... 주석

@Retention(RetentionPolicy.RUNTIME) 
public @interface DefaultEntity {} 
// the aspect itself 

@Aspect 
public class DefaultEntityServiceAspect { 

private final Logger logger = Logger.getLogger(DefaultEntityServiceAspect.class); 

    @Around("@annotation(com.ui.aspects.DefaultEntity)") 
    public void setDefaultEntityFields(ProceedingJoinPoint joinPoint) throws Throwable { 
     logger.warn("doing something 2 huhu"); 
     joinPoint.proceed(); 
    } 
} 

그리고 마지막으로 콩 자체

@Service 
@Scope("session") 
public class AdminBean implements Serializable { 
// some code... 

    @DefaultEntity 
    public void wtfIsWrongWithYou() { 
    logger.debug("am i working?"); 
    } 
} 

내가 간단한 JUnit 테스트를 작성하는 경우 예상처럼, 그것은 노력하고 있습니다. 최대한 빨리 서버 (tomcat)에 배포했습니다. 더 이상 아무것도 작동하지 않습니다. 1000 개의 팁을 발견했지만 그 중 아무 것도 작동하지 않았습니다. 내가 stackoverflow에 모든 것을 여기에 읽어 생각 :)하지만 해결책을 찾을 수 없습니다. 나는 모든 팁을 정말로 고맙게 생각할 것이다.

건배!

편집 :

나는 github에 작은 프로젝트를 만들었습니다. 나는 아직도 그것을 달리지 않았다. 만일 누군가 힌트를 가지고 있으면, 나에게 알려주세요! 고맙습니다!

+0

귀하의 양상이 절대로 집어 들지 않습니다. '@Aspect'는'@ Component'가 아니기 때문에 여러분의 구성 요소 스캔에 의해 절대 선택되지 않습니다. 또한 구성 요소를 두 번 스캔하지 않도록하십시오! 한 번만로드하는지 확인하십시오. 또한 aspect에 결함이있다. around aspect는 항상'Object'를 반환해야하고, 호출의 결과를'proceed'로 리턴해야합니다. 당신이하지 않으면 당신은 프로그램의 적절한 기능을 깨뜨릴 가능성이 높습니다. 왜냐하면이 측면이 갑자기 'null'을 반환하기 때문에 적용됩니다. –

+0

죄송합니다. 해당 부분을 복사하지 않았습니다. - /. 나는 그 지위를 편집했다. 애스펙트 기능은 테스트에서 잘 작동합니다 ... 다른 제안 사항이 있습니까? 고맙습니다! – djnose

+0

귀하의 측면이 깨 졌으므로 프로그램이 중단됩니다. 이제는 무언가를 반환하는 메소드에 적용하자마자 void 메쏘드에 적용 되었기 때문에 작동합니다.내 첫 번째 언급에서 언급했듯이 불행한 경우 프록시 및 비인증 인스턴스가있을 경우 동일한 구성 요소를 두 번 스캔하지 않도록하십시오. –

답변

0

마침내 내 "큰"응용 프로그램에서도 작동하게 만들었습니다. 근본 원인은 내가 모든 봄/동면 자 aso를 외부화했다는 것이 었습니다. 라이브러리. 사실 나는 tomcat에서 공유 라이브러리 설정을 사용하고 있었고 그 서버에 모든 스프링 라이브러리를 가지고있었습니다. 이것은 aspectj/spring aop을 사용하지 않는 한 잘 작동합니다. lib (WEB-INF/lib)가 포함 된 war 파일을 만든 후 즉시 작동합니다.

libs가 다른 클래스 로더에 의해로드되기 때문에 일종의 의미가 있습니다 ... 누군가에게 도움이되기를 바랍니다!

+0

github 프로젝트를 살펴 보았습니다. 클래스를 컴파일하기 위해 maven-aspectj-plugin을 사용하지 않았습니다. 이 코드를 사용하지 않고 코드가 어떻게 작동합니까? 설명해 주시겠습니까? 감사. –

+0

이 게시물 [링크] (http://stackoverflow.com/questions/1606559/spring-aop-vs-aspectj)을 확인하실 수 있습니다. 나는 그것이 아주 잘 거기에서 설명된다라고 생각한다 :) – djnose

관련 문제