나는 누군가가 나를 도울 수 있기를 정말로 바란다. 나는 웹 애플리케이션에서 아주 간단한 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에 작은 프로젝트를 만들었습니다. 나는 아직도 그것을 달리지 않았다. 만일 누군가 힌트를 가지고 있으면, 나에게 알려주세요! 고맙습니다!
귀하의 양상이 절대로 집어 들지 않습니다. '@Aspect'는'@ Component'가 아니기 때문에 여러분의 구성 요소 스캔에 의해 절대 선택되지 않습니다. 또한 구성 요소를 두 번 스캔하지 않도록하십시오! 한 번만로드하는지 확인하십시오. 또한 aspect에 결함이있다. around aspect는 항상'Object'를 반환해야하고, 호출의 결과를'proceed'로 리턴해야합니다. 당신이하지 않으면 당신은 프로그램의 적절한 기능을 깨뜨릴 가능성이 높습니다. 왜냐하면이 측면이 갑자기 'null'을 반환하기 때문에 적용됩니다. –
죄송합니다. 해당 부분을 복사하지 않았습니다. - /. 나는 그 지위를 편집했다. 애스펙트 기능은 테스트에서 잘 작동합니다 ... 다른 제안 사항이 있습니까? 고맙습니다! – djnose
귀하의 측면이 깨 졌으므로 프로그램이 중단됩니다. 이제는 무언가를 반환하는 메소드에 적용하자마자 void 메쏘드에 적용 되었기 때문에 작동합니다.내 첫 번째 언급에서 언급했듯이 불행한 경우 프록시 및 비인증 인스턴스가있을 경우 동일한 구성 요소를 두 번 스캔하지 않도록하십시오. –