Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用AspectJ和log4j记录原始行号?_Java_Spring_Log4j_Aop - Fatal编程技术网

Java 如何使用AspectJ和log4j记录原始行号?

Java 如何使用AspectJ和log4j记录原始行号?,java,spring,log4j,aop,Java,Spring,Log4j,Aop,如何使用AspectJ(Spring)框架记录方法的原始行号?我是aop编程的新手,所以我只想知道它是否可能或者如何实现?由于aop将委托我的方法的调用过程,从而生成新类和新方法,所以记录的行号始终不是原始行号 以下是我的一些代码: 基于架构的aop配置: <bean id="logInterceptor" class="com.fuhu.appsub.aop.LogInterceptor"></bean> <aop:config> <aop:a

如何使用AspectJ(Spring)框架记录方法的原始行号?我是aop编程的新手,所以我只想知道它是否可能或者如何实现?由于aop将委托我的方法的调用过程,从而生成新类和新方法,所以记录的行号始终不是原始行号

以下是我的一些代码:

基于架构的aop配置:

<bean id="logInterceptor" class="com.fuhu.appsub.aop.LogInterceptor"></bean>
<aop:config>
    <aop:aspect id="logDBAspect" ref="logInterceptor">
    <aop:pointcut id="logDBPointcut" expression="execution(*            com.fuhu.appsub.service..*(..)) " />
        <aop:after-throwing  pointcut-ref="logDBPointcut" throwing="ex" method="logDBException"/>           
    </aop:aspect>
</aop:config>

你在用什么?Java上的Spring AOP。它通常足以满足您的需要,它相当简单,并且根本不会干扰堆栈跟踪行号。

即使是真正的AspectJ也不会更改原始代码的行号


这是因为类文件中的行号存储在行号表中。这个表允许它在一个“行”中有多个语句。因此,即使是额外的AOP调用也不能更改行号。

显然,在完成之前我已经阅读了您的问题。您使用的是SpringAOP,因此您应该从中获得准确的行号;但是,我从未使用过Thread.getStackTrace,因此可能您从中获得了一些特殊的行为。就风格而言,捕获异常和抛出异常都是非常糟糕的做法。还值得注意的是,抛出的异常有自己的stacktrace,您的logDBException方法可以从中轻松提取所需信息,而不是将其构建到异常消息中。嘿,Ryan,我用您所说的方法得到了它,真的非常感谢您。如果您使用的是Sonar之类的工具,代码样式不允许在一行中放置多个语句。
@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
public List<Item> findByName (String name) throws Exception{
    try
    {
        List<Item> itemList = itemRepository.findByName(name);
        int i=0,j=1;
        int k = j/i;
        return itemList;
    }
    catch(Exception ex)
    {
        throw new Exception(ex.getMessage() + "in findByName with name=" + name + "  file:" + Thread.currentThread().getStackTrace()[2].getFileName() + "  line:" + Thread.currentThread().getStackTrace()[2].getLineNumber());
    }
}
 public void logDBException( JoinPoint joinPoint, Exception ex) {
         if(loggerDB.isErrorEnabled()){
             loggerDB.error(ex.getMessage());
         }
  }