首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AspectJ与weblogic

AspectJ与weblogic
EN

Stack Overflow用户
提问于 2014-05-11 08:45:58
回答 2查看 2.6K关注 0票数 2

我试图使用LTW在Weblogic上运行AspectJ。我的切入点是针对公共构造函数和方法的,而建议是针对are、AfterReturning和AfterThrowing的。当我访问一个简单的"Hello“jsp时,我会收到以下错误:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
<aspectj>
    <aspects>
        <aspect name="foo.aspect.DefaultAspect" />
    </aspects>
    <weaver options="-verbose">
        <include within="foo.aspect.*" />
        <include within="jsp_servlet..*"/>
    </weaver>
</aspectj>         

这是我的方面文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
java -javaagent:<path_to aspectweaver.jar> -Xbootclasspath/p:<path to {foo.jar, aspectweaver.jar}>

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

请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 12:33:15

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

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

  1. 您想要组织的目标类:--所有想要对其进行方面处理的类都应该在类路径中。对于一个典型的应用程序,它们将在您的应用程序WEB/lib或WEB/类中,所以让它们存在。这里没有变化。
  2. AOP.xml: --织布器使用它来发现方面和织布配置。这也应该可以在类路径中使用。您可以将其放入/lib文件夹中的JAR中,以便它的配置可用于所有应用程序(JAR和JAR)。
  3. 方面类(Es):如果对方面类使用注释,那么“它也需要编织”。AspectJ weaver向该类添加了一些特殊方法(如aspectOf)。因此,它必须在类路径中可用。这可以是与(2)相同的JAR的一部分。如果您已经使用ajc ( aspectJ编译器)编译了它,那么它也可以放在引导路径中(但与lib文件夹相比没有真正的优势)。

注意:由于这个类需要编织,所以它必须存在于AOP.xml中的标记中,而不是您想要在其上显示的类/包列表。

  1. 编织器本身(在aspectjweaver.jar中):应该可以通过java代理获得,因此将以下行添加到/bin/setDomainEnv.cmd 如果使用-javaagent:%ASPECT_HOME%\lib\aspectjweaver.jar设置JAVA_OPTIONS=%JAVA_OPTIONS% JAVA_OPTIONS,则还需要执行导出JAVA_OPTIONS。

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

  • 像我一样摆弄鞋底,
  • 任何类路径中的aspectjrt.jar
票数 3
EN

Stack Overflow用户

发布于 2014-05-11 11:37:18

您是否尝试过将aspectjrt.jar添加到类路径中?实际上,它应该是aspectweaver.jar的一个子集,而不是必要的,但是您可能无论如何都想尝试一下。

更新: Java :Java,可能问题是您将方面放在引导类路径上,而不是普通的类路径,甚至预先准备它,即首先找到它,甚至在代理之前。也许你想改变这种状况。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23590662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档