为什么在代理的异常日志中不打印行号?

时间:2016-09-09 10:16:38

标签: java spring exception proxy

为什么弹簧代理不打印行号?

有时我会在日志中获得删除,但我看到行号未打印。我主要看到了春天的CGLIB代理。例如 在下面的堆栈跟踪中,我看到没有为spring管理的CustomerServiceBean代理打印行号。

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
at com.xeb.customer.account.CustomerServiceBean$$EnhancerByCGLIB$$5a0112c7.getCustomerDetails(<generated>)
at com.xeb.customer.account.CustomerUtil.getCustomerDetails(CustomerUtil.java:142)

知道为什么吗?是否有配置在代理中打印行号?

更新: - 我了解代理是在运行时生成的,所以打印它们的行是没有意义的(如果打印无关紧要)。但我的问题 如何才能在CustomerServiceBean.java中获得代理CustomerServiceBean$$EnhancerByCGLIB$$5a0112c7.getCustomerDetails背后的实际类的异常行?

1 个答案:

答案 0 :(得分:0)

这些代理类是在运行时通过直接字节代码生成动态生成的。因此这些类没有相应的java源文件。

虽然分配(随机)行号在技术上是可行的,但这不是有意义的。

如果在类的代码中抛出异常,则堆栈跟踪将包含类的名称和相应的行号。

作为(假设的)示例,基于您提供的堆栈跟踪:

at com.xeb.customer.account.CustomerServiceBean.getCustomerDetails(CustomerServiceBean.java:<your linenumber>)
at ...
at java.lang.reflect.Method.invoke(Method.java:...)
at ...
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
at com.xeb.customer.account.CustomerServiceBean$$EnhancerByCGLIB$$5a0112c7.getCustomerDetails(<generated>)
at com.xeb.customer.account.CustomerUtil.getCustomerDetails(CustomerUtil.java:142)