0

我有一个多模块 Maven 项目,其中包含以下相关模块的设置:

    • 公共应用程序
      • 后端
      • 前端

模块前端内置在战争中并部署在 Tomcat 上。模块后端是打包为 jar 的标准 Java 应用程序。我想要完成的只是使以下方面工作(在前端和后端):

@Aspect
public class VirtuosoSequenceSanitizerAspect {

    @Around("execution(* cz.cuni.mff.xrg.odcs.commons.app.facade.*Facade.save(..))")
    public Object sanitizeSequenceOnSave(ProceedingJoinPoint pjp) throws Throwable {
        // ... some code
    }

    @Before("execution(* org.eclipse.persistence.internal.descriptors.ObjectBuilder.assignSequenceNumber(java.lang.Object, org.eclipse.persistence.internal.sessions.AbstractSession))")
    public void rememberAssignSequence(JoinPoint jp) {
        // .. some code
    }
}

这方面在 commons-app-context.xml 中设置为 Spring bean,如下所示:

<!-- enable aspects -->
<aop:aspectj-autoproxy />

<!-- Aspect for fixing corrupted database sequences. -->
<bean id="sequenceAspect" class="cz.cuni.mff.xrg.odcs.commons.app.dao.VirtuosoSequenceSanitizerAspect" />

使用此设置,around 建议可以正常工作,但是不会触发 before 建议。根据我的发现,我得出结论,我需要使用 aspectj-maven-plugin 来编织到 3rd 方库。所以我将插件添加到 commons-app 模块的 pom.xml 中,如下所示:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.5</version>
    <configuration>
        <source>1.7</source>
        <target>1.7</target>
        <complianceLevel>1.7</complianceLevel>
        <showWeaveInfo>true</showWeaveInfo>
        <verbose>true</verbose>
        <!-- Weave EclipseLink dependency -->
        <weaveDependencies>
            <weaveDependency>
                <groupId>org.eclipse.persistence</groupId>
                <artifactId>eclipselink</artifactId>
            </weaveDependency>
        </weaveDependencies>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
    </dependencies>
</plugin>

在建议工作之前使用此插件,但围绕建议停止工作。我一直在努力正确设置,所以这两个建议都按预期工作,但无济于事。在构建 commons-app 模块日志时说这两个建议都是编织的:

--- aspectj-maven-plugin:1.5:compile (default) @ commons-app ---
Join point 'method-execution(void cz.cuni.mff.xrg.odcs.commons.app.facade.ScheduleFacade.save(cz.cuni.mff.xrg.odcs.commons.app.scheduling.Schedule))' in Type 'cz.cuni.mff.xrg.odcs.commons.app.facade.ScheduleFacade' (ScheduleFacade.java:127) advised by around advice from 'cz.cuni.mff.xrg.odcs.commons.app.dao.VirtuosoSequenceSanitizerAspect' (VirtuosoSequenceSanitizerAspect.java:90)
Join point 'method-execution(void cz.cuni.mff.xrg.odcs.commons.app.facade.DPUFacade.save(cz.cuni.mff.xrg.odcs.commons.app.dpu.DPUTemplateRecord))' in Type 'cz.cuni.mff.xrg.odcs.commons.app.facade.DPUFacade' (DPUFacade.java:123) advised by around advice from 'cz.cuni.mff.xrg.odcs.commons.app.dao.VirtuosoSequenceSanitizerAspect' (VirtuosoSequenceSanitizerAspect.java:90)
Join point 'method-execution(void cz.cuni.mff.xrg.odcs.commons.app.facade.DPUFacade.save(cz.cuni.mff.xrg.odcs.commons.app.dpu.DPUInstanceRecord))' in Type 'cz.cuni.mff.xrg.odcs.commons.app.facade.DPUFacade' (DPUFacade.java:185) advised by around advice from 'cz.cuni.mff.xrg.odcs.commons.app.dao.VirtuosoSequenceSanitizerAspect' (VirtuosoSequenceSanitizerAspect.java:90)
Join point 'method-execution(void cz.cuni.mff.xrg.odcs.commons.app.facade.PipelineFacade.save(cz.cuni.mff.xrg.odcs.commons.app.pipeline.Pipeline))' in Type 'cz.cuni.mff.xrg.odcs.commons.app.facade.PipelineFacade' (PipelineFacade.java:134) advised by around advice from 'cz.cuni.mff.xrg.odcs.commons.app.dao.VirtuosoSequenceSanitizerAspect' (VirtuosoSequenceSanitizerAspect.java:90)
...

但是,当我将前端部署到 Tomcat 时,只会触发之前的建议。如何配置 Maven 以始终编织两个建议?

4

1 回答 1

0

My mistake, I actually found out, that the around advice is being triggered. I did not see this because the code did not do what I expected. Also, I thought it is not triggered because a debugger breakpoint was not hit. From a brief googling I found the reason...

If around advice is inlined, the debugger can't figure out what to do (we still have some JSR 45 related work to do in this area, and possibly so does the Eclipse debugger). To debug around advice, you also need to go to the project properties and turn off the "inline around advice" AspectJ compiler option. Debugging should then hopefully work as expected...

于 2013-12-12T23:25:03.573 回答