你好,我是Spring AOP的新手。 我写了这样的话:
我的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExceptionHandling {
String onSuccess();
String onFailture();
}
Aspect类:
@Aspect
public class ExceptionHandler implements Serializable {
@Pointcut(value="execution(public * *(..))")
public void anyPublicMethod() {
}
@Around("anyPublicMethod() && @annotation(exceptionHandling)")
public Object displayMessage(ProceedingJoinPoint joinPoint,ExceptionHandling exceptionHandling) throws FileNotFoundException {
try{
Object point = joinPoint.proceed();
new PrintWriter(new File("D:\\log.txt")).append("FUUCK").flush();
FacesMessageProvider.showInfoMessage(
FacesContext.getCurrentInstance(),exceptionHandling.onSuccess());
return point;
} catch(Throwable t) {
new PrintWriter(new File("D:\\log.txt")).append("FUUCK").flush();
FacesMessageProvider.showFatalMessage(
FacesContext.getCurrentInstance(),
exceptionHandling.onFailture());
return null;
}
}
}
来自ManagedBean的方法
@ExceptionHandling(onSuccess=IMessages.USER_UPDATED,onFailture=IMessages.WRONG_DATA)
public void onClickUpdateFromSession(){
onClickUpdate(sessionManager.getAuthenticatedUserBean());
}
和app-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.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.2.xsd
">
<aop:aspectj-autoproxy/>
<bean id="exceptionHandler"
class="eteacher.modules.ExceptionHandler"/>
<bean id="sessionManager"
class="eteacher.modules.SessionManager"
scope="session"/>
</beans
我正在尝试使用Spring AOP创建异常处理程序 和JSF消息,但它不会激发建议。 请帮帮我。
答案 0 :(得分:0)
Spring AOP只适用于Spring托管bean,即ApplicationContext中的bean。由于您的JSF bean不是由Spring管理,而是由JSF容器管理,因此AOP部分不起作用。
要使其工作要么使您的JSF托管bean Spring托管bean(请参阅Spring Reference Documentation)或切换到loadtime或编译您的Aspects的编织时间。
关于加载时编织的一个注意事项是,如果在加载Spring上下文之前加载了JSF类,它可能会工作,新注册的自定义类加载器不能修改已加载类的字节码。