【问题标题】:NoAspectBoundException with aspectj and tapestry 5带有aspectj和tapestry 5的NoAspectBoundException
【发布时间】:2011-01-03 21:31:41
【问题描述】:

我有一个使用 Tapestry 5.2.1 构建的 Web 项目。我有一个简单的日志记录方面,用于跟踪此应用程序。一切正常,直到我开始重构应用程序的某些部分并尝试部署它。

当我部署应用程序时,无论我尝试转到哪个页面,都会收到以下异常:

Caused by: java.lang.RuntimeException: Exception assembling root component of page Index: Exception while initializing TraceAspect: org.aspectj.lang.NoAspectBoundException: TraceAspect
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.performAssembleRootComponent(ComponentAssemblerImpl.java:124)
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.access$000(ComponentAssemblerImpl.java:38)
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl$1.invoke(ComponentAssemblerImpl.java:82)
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl$1.invoke(ComponentAssemblerImpl.java:79)
    at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65)
    ... 73 more
Caused by: org.aspectj.lang.NoAspectBoundException: Exception while initializing TraceAspect: org.aspectj.lang.NoAspectBoundException: TraceAspect
    at TraceAspect.aspectOf(TraceAspect.aj:1)
    at com.wex.rrt.wrightweb.reportrequest.webapp.pages.Index.initializer(Index.java:3)
    at com.wex.rrt.wrightweb.reportrequest.webapp.pages.Index.<init>(Index.java)
    at $Instantiator_12d4da06f67.newInstance($Instantiator_12d4da06f67.java)
    at org.apache.tapestry5.internal.structure.InternalComponentResourcesImpl.<init>(InternalComponentResourcesImpl.java:146)
    at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.<init>(ComponentPageElementImpl.java:593)
    at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.<init>(ComponentPageElementImpl.java:609)
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.performAssembleRootComponent(ComponentAssemblerImpl.java:93)
    ... 77 more
Caused by: org.aspectj.lang.NoAspectBoundException: TraceAspect
    at TraceAspect.aspectOf(TraceAspect.aj:1)
    at AbstractLoggingAspect.<init>(AbstractLoggingAspect.aj:7)
    at TraceAspect.<init>(TraceAspect.aj:12)
    at TraceAspect.ajc$postClinit(TraceAspect.aj:1)
    at TraceAspect.<clinit>(TraceAspect.aj:1)
    ... 84 more

我的方面没有改变,是这样的:

@Aspect
public class TraceAspect {

    Logger logger = Logger.getLogger("trace");

    public TraceAspect() {
        logger.setLevel(Level.ALL);
    }

    /**
     * Will log every execution of
     * <ul>
     * <li>doEverything</li>
     * <li>doSomething</li>
     * </ul>
     * excluding any test classes.
     */
    @Pointcut("(execution(public void *(..)) || execution(*.new(..))) && !within(*Test) !within(com.aspects.*)")
    protected void logging() {
    }

    @Around("logging()")
    public void doThing(final ProceedingJoinPoint thisJoinPoint) throws Throwable {
        final String joinPointName = thisJoinPoint.getThis().getClass().getSimpleName() + "." + thisJoinPoint.getSignature().getName() + "()";
        logger.info("Entering [" + joinPointName + "]");
        thisJoinPoint.proceed();
        logger.info("Leaving  [" + joinPointName + "]");
    }
}

在编译期间一切正常。我正在使用 maven 插件来编译方面:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.3</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <complianceLevel>1.6</complianceLevel>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal> 
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我一天中的大部分时间都在断断续续地工作,但一无所获。我不完全理解NoAspectBoundException。编译器似乎没有完全编织方面?我是AspectJ 的新手,但我想知道这是否与Tapestry5 有关。虽然我知道 Tap5 使用 AOP。

正如我所说,这一切都正常工作,直到我将一些东西移到一个单独的挂毯自定义库中,该库现在是我的 Web 应用程序的依赖项。

【问题讨论】:

    标签: java aop aspectj tapestry


    【解决方案1】:

    由于切入点的execution(*.new(..)) 部分不受限制,您正在建议方面的构造函数。当切面被实例化时,通知没有切面的实例,因此出现错误。您应该可以通过添加 !within([package of].TraceAspect) 来解决此问题。

    【讨论】:

    • 更新了我上面的方面。我添加了 `!within(com.aspects.*) 并且当我尝试访问页面时仍然遇到相同的异常。
    • 我也试过排除组件库的包,但结果和上面一样。
    • 我对Tapestry了解不多,但是是不是加载Tapestry组件的类加载器看不到切面?
    【解决方案2】:

    我认为我们遇到了 AOP 冲突。 AspectJ 对代码做了一些事情,然后 Tapestry 出现并做其他事情……包括忽略组件类上现有的 Class 构造函数并添加它自己的构造函数。我不确定如何让两者一起工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多