当前位置: 首页 > 知识库问答 >
问题:

日志记录中的切入点表达式问题,Spring AOP与log4j

钱志
2023-03-14
@Pointcut("execution(* com.mycomp..(..))")
private void businessService() {}  // signature
Caused by: java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting
'name pattern cannot finish with ..' at character position 27
 execution(* com.mycomp..(..))
 @Pointcut("execution( com.xyz.someapp..service..(..))")

关于使用pointcut@around(value=“execution(*xyz.package.foo.bar..*(..))”)正如James所建议的那样,当我启动服务器时,我会遇到新的异常。

   Caused by: java.lang.IllegalStateException: Cannot convert value of type [$Proxy76 implementing org.springframework.context.ApplicationContextAware,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.mycompname.BancsContextAware] for property 'bancsContextAware': no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:264)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:448)
... 57 more

后来在调试中,我发现在其中一个类中我使用的是object.getClass().getAnnotation(),而由spring AOP创建的代理对象没有注释。正因为如此,我才得到了一个空指针异常。我使用aopproxyutils.ultimateTargetClass(someObject)对其进行了排序,但现在的问题是,我在com.mycom的子包中有一些最终的类和枚举。因为这个我得到了

nested exception is org.springframework.aop.framework.AopConfigException: 
Could not generate CGLIB subclass of class [class com.mycom.util.BancsServiceProvider]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.mycom.util.BancsServiceProvider
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)

那么如何从Spring AOP切入点中排除final类和枚举。

共有1个答案

傅阿苏
2023-03-14

您正在寻找的切入点和方法如下所示:

@Around(value="execution(* xyz.package.foo.bar..*(..))")
public Object beforeAdvice(ProceedingJoinPoint jp) throws Throwable {
    //Get log4j logger for target class.
    Logger logger = LogManager.getLogger(jp.getTarget().getClass());

    logger.info(jp.getTarget().getClass().getName() + " " + jp.getSignature().getName() + " "
            + "Hit:");
    Object returnVal = jp.proceed(jp.getArgs());
    logger.info(jp.getTarget().getClass().getName() + " " + jp.getSignature().getName() + " "
            + "Finished:");
    return returnVal;
}

上面的代码将在进入方法之前记录类和方法名称以及“hit”,一旦以以下方式完成,则记录“finished”:

xyz.package.foo.bar.service.getPerson: Hit:
xyz.package.foo.bar.dao.getPerson: Hit:
xyz.package.foo.bar.dao.getPerson: Finished:
xyz.package.foo.bar.service.getPerson: Finished:
...

如果您想尝试遵循方法的多线程执行,只需使用以下方法:

@Around(value="execution(* xyz.package.foo.bar..*(..))")
public Object beforeAdvice(ProceedingJoinPoint jp) throws Throwable {
    Logger logger = LogManager.getLogger(jp.getTarget().getClass());

    String executionId = UUID.randomUUID().toString();

    logger.info(jp.getTarget().getClass().getName() + " " + jp.getSignature().getName() + " "
            + "Hit:" + executionId);
    Object returnVal = jp.proceed(jp.getArgs());
    logger.info(jp.getTarget().getClass().getName() + " " + jp.getSignature().getName() + " "
            + "Finished:" + executionId);
    return returnVal;
}
 类似资料:
  • 在传统的weblogic容器中部署spring boot web应用程序时,我遇到了一些与日志相关的异常。同一个应用程序在嵌入式tomcat上运行良好,无需对其进行任何更改。 对于weblogic 12 c,我看到了一个例外: ulticaster.java:98Aorg.springframework.boot.context.event.InstanceOf(Aistener.publish)

  • 在将big project移植到log4j2之后,我注意到异常日志不起作用。这样的代码

  • 我在我的Scala项目中使用带有sbt-aspectj的AeyJ库。我正在尝试使用表达式编写: 但我有以下例外: 以下AspectJ教程介绍: 因此,通过注释样式,可以仅在@pointcut表达式中使用if()切入点。if()不能包含任何正文。然后,带注释的@切入点方法必须是公共静态布尔的形式,并且可以像往常一样使用形式绑定 可以在Scala方法上使用切入点中的if()表达式吗?

  • 我正在寻找一种方法来集中分布式软件(用Java编写)的日志问题,这将非常简单,因为所讨论的系统只有一台服务器。但请记住,未来很可能会运行更多特定服务器的实例(并且需要更多的应用程序),因此必须有类似日志服务器的东西,它负责处理传入日志,并使支持团队能够访问这些日志。 目前的情况是,一些java应用程序使用log4j将其数据写入本地文件,因此,如果客户机过期出现问题,支持团队必须要求提供日志,这并不

  • 我使用的是Spring security 3.2.0和Spring框架的相同版本。Spring security在我的项目中工作得很好。为了保护DAO类(和其他类)中的方法,我希望使用以下切入点方法(在文件中)。 我希望指定的pointcut表达式能够保护包内所有类中的所有方法,并且只能由具有指定权限的用户访问。

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?