0

我使用 Spring 3.1 和 APO(代理)。

提供用作 Pointcat 的注释。在这种情况下,Spring AOP 代理方法“getMergeMappingsAndCals”被标注为 CalendarMappingAnnotation

我的建议是 AfterReturning

方面:

@Component
@Aspect
public class MappingFilterAspect{
    /**
     *
     * @param retVal
     */
    @AfterReturning(
        pointcut="@annotation(...annotation.CalendarMappingAnnotation)",
        returning="retVal"
    )
    public void calendarMappingFilter(Object retVal) {


    }
}

注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CalendarMappingAnnotation {
}

用法:

@Component
public class ApoiMappingManagerImpl implements ApoiMappingManager, ApplicationContextAware, Serializable {
    ...
    @CalendarMappingAnnotation
    public MergedMapAndCalsBeanCollection getMergeMappingsAndCals(){
        ...
    }
}

配置:

<context:component-scan base-package="...aus.aspect" />
<aop:aspectj-autoproxy/>

堆栈跟踪:

java.lang.ClassCastException: $Proxy43 cannot be cast to ...mapping.cals.ApoiMappingManagerImpl
[JVM ...]   at ...helpers.SaveFillRestCalsClientHelper.init(SaveFillRestCalsClientHelper.java:62)
[JVM ...]   at ...DispatcherImpl.loadPlugin(DispatcherImpl.java:426)
[JVM ...]   at ...dispatcher.DispatcherImpl.run(DispatcherImpl.java:181)
[JVM ...]   at ...DispatcherImpl.complete(DispatcherImpl.java:319)
[JVM ...]   at ...DispatcherImpl.process(DispatcherImpl.java:259)
[JVM ...]   at ...RunnerImpl.run(RunnerImpl.java:88)
[JVM ...]   at ...JvmLauncherSlave.main(JvmLauncherSlave.java:40)
4

2 回答 2

2

行为看起来是正确的。

看起来您正在转换类型的 bean 的实例,ApoiMappingManagerImpl并且代码正在引发运行时异常。这是预期行为的原因是因为底层您使用的是 Spring AOP,而 Spring AOP 本质上为您创建了一个动态代理,该代理本质上实现了接口ApoiMappingManager,在内部组合ApoiMappingManagerImpl并委托对这个组合类的调用。因此代理实现ApoiMappingManager并且不扩展ApoiMappingManagerImpl,因此出现错误。

要修复它,如果需要,您应该强制转换为接口而不是实现。

于 2013-05-09T14:37:19.000 回答
0

回答

出现这种问题是因为我没有在ApoiMappingManagerImpl实现的接口中描述这个方法

public interface ApoiMappingManager {
    public MapBeanCollection assembleMaps();
    public String getRootFolder();
    public void setRootFolder(String rootFolder);
    public ErrorList getErrorList();
    public Set<String> getAgentList();
    public Set<MapBean> getMappingSetByAgentName(String agentName);
    public CalBeanCollection assembleCals(String dateStr);
    public CalBeanCollection getCalBeanCollection();
    public MergedMapAndCalsBeanCollection getMergeMappingsAndCals();  // was missed
}
于 2013-05-09T14:39:10.123 回答