【问题标题】:AspectJ with weblogicAspectJ 与 weblogic
【发布时间】:2014-05-11 08:45:58
【问题描述】:

我正在尝试使用 LTW 在 Weblogic 上运行 AspectJ。我的切入点是针对公共构造函数和方法,建议针对的是 Before、AfterReturning 和 AfterThrowing。当我访问一个简单的“Hello World”jsp 时出现以下错误:

javax.servlet.ServletException: Servlet class: 'jsp_servlet.__index' doesn't have a default constructor
        at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:315)
        at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:288)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
        at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
        Truncated. see log file for complete stacktrace

Root cause of ServletException.
java.lang.NoSuchMethodError: foo.aspect.DefaultAspect.aspectOf()Lfoo/aspect/DefaultAspect;
       at jsp_servlet.__index._jspService(__index.java:76)
       at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
       at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
       at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
       at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
       Truncated. see log file for complete stacktrace

这是我的 aop.xml 文件:

<aspectj>
    <aspects>
        <aspect name="foo.aspect.DefaultAspect" />
    </aspects>
    <weaver options="-verbose">
        <include within="foo.aspect.*" />
        <include within="jsp_servlet..*"/>
    </weaver>
</aspectj>         

这是我的方面文件:

package foo.aspect;

@Aspect
public class DefaultAspect  {

@Pointcut("execution(public *.new(..)) && !within(foo.aspect.*)")
public void pointCutNew(JoinPoint thisJoinPoint) {
}

@After("pointCutNew(thisJoinPoint)")
public void adviceForNew(JoinPoint thisJoinPoint) {
}
//Simiar pattern for other advices and pointcuts (for methods)
}

这个方面被编译(使用普通的 javac 编译器)成 foo.jar

我通过添加以下内容来运行 Weblogic:

java -javaagent:<path_to aspectweaver.jar> -Xbootclasspath/p:<path to {foo.jar, aspectweaver.jar}>

我认为这很可能是类路径/类加载器问题,因为 AspectJ 无法在 DefaultAspect 类中创建“aspectOf()”方法

请帮忙。

【问题讨论】:

    标签: weblogic aop aspectj aspect pointcut


    【解决方案1】:

    找到答案。请注意,这仅适用于 LTW(加载时间编织)

    从编织的角度来看,主要有 4 个关键组件:

    1. 您要编织的目标类: 所有你想看的东西都应该在类路径中。对于典型的应用程序,它们将在您的应用程序 WEB-INF/lib 或 WEB-INF/classes 中,所以让它们在那里。这里没有变化。

    2. AOP.xml: weaver 使用它来发现 Aspect 和 Weaver 配置。这也应该在类路径中可用。您可以将其放在 /lib 文件夹中的 JAR 中,以便其配置可用于所有应用程序(EAR 和 WAR)。

    3. Aspect 类: 如果对 Aspect 类使用注解,那么“它也需要被编织”。 AspectJ weaver 为这个类添加了一些特殊的方法(如 aspectOf)。因此它必须在类路径中可用。这可以是与 (2) 相同的 JAR 的一部分。如果您已经使用 ajc(aspectJ 编译器)编译了它,那么它也可以放在 bootclasspath 中(但与 lib 文件夹相比并没有真正的优势)。

    注意:由于这个类需要被编织,它必须存在于AOP.xml中的标签中,而不是你想要Aspect的类/包列表中

    1. 编织器本身(在 aspectjweaver.jar 中):这应该可以通过 java 代理获得,所以将以下行添加到 /bin/setDomainEnv.cmd

      SET JAVA_OPTIONS=%JAVA_OPTIONS% -javaagent:%ASPECT_HOME%\lib\aspectjweaver.jar 如果使用 setDomainEnv.sh,您还需要执行 EXPORT JAVA_OPTIONS。

    所以,对于LTW来说,真的不需要

    • 摆弄引导类路径(就像我一样),
    • 任何类路径中的aspectjrt.jar

    【讨论】:

      【解决方案2】:

      您是否尝试过将 aspectjrt.jar 添加到类路径中?实际上它应该是 aspectweaver.jar 的一个子集并且没有必要,但也许你还是想尝试一下。

      更新: 嗯,也许问题是你把你的方面放在引导类路径而不是普通的类路径上,甚至放在它前面,即你让它首先被发现,甚至可能在 Java 之前代理人。也许你想改变它。

      因为我不是应用服务器用户,也不是 Weblogic 专家,所以您可能需要咨询 http://rajiv-kuriakose.blogspot.de/2011/03/aspectj-example-with-weblogic-server.html 以获取示例配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 2010-12-09
        • 2021-08-01
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多