在@Bean方法上带有自定义注释的Spring AOP
我试图使用AOP和注释触发,正如您在这个切入点中看到的那样在@Bean方法上带有自定义注释的Spring AOP,spring,spring-aop,Spring,Spring Aop,我试图使用AOP和注释触发,正如您在这个切入点中看到的那样 package mypackage.aop; // ... @Aspect @Component public class ErrorHandlerAspect { private final static Logger LOGGER = LoggerFactory.getLogger(ErrorHandlerAspect.class); @Pointcut("within(mypackage.config.st
package mypackage.aop;
// ...
@Aspect
@Component
public class ErrorHandlerAspect {
private final static Logger LOGGER = LoggerFactory.getLogger(ErrorHandlerAspect.class);
@Pointcut("within(mypackage.config.steps..*) && @annotation(mypackage.aop.SaveAndErrors)")
private void pointcut(){ }
@Around("pointcut()")
private Object errorHandler(ProceedingJoinPoint pjp) throws Throwable{
try{
return pjp.proceed();
} catch (Throwable e){
LOGGER.error("Handling error");
throw e;
}
}
}
以下是注释声明:
package mypackage.aop;
// ...
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SaveAndErrors { }
。。。和@Configuration类中的用法(用于spring批处理步骤配置):
不幸的是,这是行不通的。
从切入点删除&&@annotation(mypackage.aop.SaveAndErrors),我的aop代理正在工作
错误在哪里?我不是Spring用户,我使用纯AspectJ。但据我所知,我认为SpringAOP只适用于
@组件。如果它也适用于@Configuration
实体,我不能说,但这可能就是问题所在。当您说在删除第二个条件时该方面起作用时,您是否确实验证过(例如,使用日志语句)它也会为方法xFileReader
触发?嗨。当我删除该语句时,调试器将在我的停止点停止:return pjp.procedure();我还尝试了另一种方法,仅使用@annotation
和bean的方法(仅使用我的SaveAndErrors注释)(在@configuration
classe之外)。这个相位也被称为相位。我不理解你最后的评论。对不起,我不知道你想告诉我什么。什么是“陈述”,哪里是“你的停止点”,什么是“方法”?也许你应该在GitHub.Hi上创建一个。我配置这个切入点:@pointcut(@annotation(mypackage.aop.savenderrors)”)
并且我在@Component公共类A{@savenderrors public void operation()抛出xException{try{//return…}捕获(YeException e){抛出新的xException上设置了@savenderrors
(“新异常:”,e);}}
在本例中,我的aspect被调用。正如我所说,类StepConfiguration
不是@Component
。我不是Spring用户,我使用纯AspectJ。但据我所知,我认为Spring AOP只适用于@Component
s。如果它也适用于@Configuration
实体,我不能说,但这可能是真的这可能是问题所在。当您说在删除第二个条件时,方面可以工作时,您是否真的验证过(例如,使用日志语句)它也会为方法xFileReader
触发?您好。当我删除该语句时,调试器会在我的停止点停止:return pjp.continue();我还尝试了另一种方法,仅使用@annotation
和bean的方法(仅使用我的SaveAndErrors注释)(在@configuration
classe之外)。aspect也被调用。我不理解你最后的评论。对不起,我不知道你想告诉我什么。什么是“语句”,哪里是“你的停止点”,什么是一个方法“?也许你应该创建一个,可能是在GitHub.Hi上。我配置这个切入点:@pointcut(@annotation(mypackage.aop.savenderrors)”)
,我在@Component公共类a{@savenderrors public void operation()上设置@savenderrors
,抛出xException{try{//return…}catch(yException e){throw new xException(“new Exception:,e);}}}}}
在本例中,调用了我的方面。正如我所说,类StepConfiguration
不是@组件。
package mypackage.config.steps;
// ...
@Configuration
public class StepConfiguration {
public final static String STEP_NAME = "xStep";
// ...
@SaveAndErrors
@Bean(name="xFileReader")
@StepScope
public ItemStreamReader<Object> xFileReader(@Value("#{stepExecutionContext['fileName']}") String resourceName // Inside a partitionner) throws xException {
try {
// ...
// return ...
} catch (yException e) {
throw new xException("new Exception :", e);
}
}
// ...
}
@SpringBootApplication
public class Application { //...
}