升级到Spring Boot 1.4.0后,AbstractPlatformTransactionManager中出现NullPointerException

2023-12-07

我已从 Spring Boot 1.3.2 升级到 1.4.0,现在无法启动我的应用程序 - 我的BeanPostProcessor调用 3d party 开源 Lazy Chopper,当尝试getTransaction(),这里失败:

public abstract class AbstractPlatformTransactionManager implements PlatformTransactionManager, Serializable {

    protected transient Log logger = LogFactory.getLog(getClass());
    // ...
    @Override
    public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
        Object transaction = doGetTransaction();

        // Cache debug flag to avoid repeated checks.
        boolean debugEnabled = logger.isDebugEnabled(); // logger is null here

当我在那里放置断点时,我可以看到logger确实是null,但如果值得一提的是,如果我调用LogFactory.getLog(getClass())我自己就在那里,我确实得到了正确的记录器。

似乎我的 bean 在初始化正确的 Logger 之前调用了该方法?..

这是我得到的完整堆栈跟踪:

Caused by: java.lang.NullPointerException: null
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:340) ~[spring-tx-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:426) ~[spring-tx-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:275) ~[spring-tx-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at com.tikal.lazychopper.DefaultLazyInitializationChopperAdvice.chop(DefaultLazyInitializationChopperAdvice.java:76) ~[lazy-chopper-1.2.8.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_101]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at com.sapiens.bdms.core.service.impl.sign.hash.MD5StringCalculator$$EnhancerBySpringCGLIB$$b5747fb.getSignTypes(<generated>) ~[classes/:na]
at com.sapiens.bdms.core.service.impl.sign.EntitySignCalculatorManagerImpl.postProcessAfterInitialization(EntitySignCalculatorManagerImpl.java:105) ~[classes/:na]
at com.sapiens.bdms.core.service.impl.sign.EntitySignCalculatorManagerImpl$$FastClassBySpringCGLIB$$80ef4d8e.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at com.sapiens.bdms.core.service.impl.sign.EntitySignCalculatorManagerImpl$$EnhancerBySpringCGLIB$$91a9897b.postProcessAfterInitialization(<generated>) ~[classes/:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]

我用的是默认的logback自动配置,无需调整。

更新#1:围绕该方法定义了切点。

            <aop:pointcut id="transactionManagerPointcut"
                      expression="(execution(* org.springframework.transaction.PlatformTransactionManager.getTransaction(..)))"/>

更新#2:所以看来摆脱这个方面就成功了。仍在试图找出原因以及如何克服这个问题。

这是方面的定义:

            <aop:pointcut id="transactionManagerPointcut"
                      expression="(execution(* org.springframework.transaction.PlatformTransactionManager.getTransaction(..)))"/>

        <aop:pointcut id="allServices"
                      expression="(execution(* com.decision..tx..*.*(..))) or (execution(* com.sapiens.bdms..tx..*.*(..))) &amp;&amp; !@annotation(com.sapiens.bdms.core.persistence.annotation.NotTransactional)"/>
        <aop:aspect ref="sessionFilterConfigurator">
            <aop:before method="setupFilter"
                        pointcut-ref="allServices"/>
            <aop:after-returning method="setupFilter"
                                 pointcut-ref="transactionManagerPointcut"/>
        </aop:aspect>

这是方面方法:

    @Component("sessionFilterConfigurator")
public class SessionFilterConfigurator {
    @Resource
    private Collection<FilterConfiguration> filterConfigurations;
    @Resource
    private SessionFactory sessionFactory;
    @Resource
    private FiltersDisconnector filtersDisconnector;

    public void setupFilter() throws Throwable {
        Session session = sessionFactory.getCurrentSession();
        if (AutoEnableConfig.isFiltersEnabled()) {
            for (FilterConfiguration filterConfiguration : filterConfigurations) {
                Filter filter = session.enableFilter(filterConfiguration.getFilterName());
                for (Map.Entry<String, Object> entry : filterConfiguration.getFilterParameters().entrySet()) {
                    filter.setParameter(entry.getKey(), entry.getValue());
                }
            }
            AutoEnableConfig.disableFilterEnabling();
            ((EventSource) session).getActionQueue().registerProcess(filtersDisconnector);
        }
    }
}

仍然不清楚为什么在这种情况下会破坏记录器,以及为什么只有在升级到 1.4.0 之后......


我也遇到了同样的问题。我的错误是,由于切入点定义错误,我最终将方面应用到 TransactionManager 上(我扩展了标准的方面)。所以空记录器是 CGLIB 生成的扩展类之一。真正的 bean 已经很好地实例化了它的记录器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

升级到Spring Boot 1.4.0后,AbstractPlatformTransactionManager中出现NullPointerException 的相关文章

随机推荐

  • 使用 Fabric.js 和 HTML5 在图像画布上编写自定义文本

    我正在使用 HTML5 和fabric js用于上传多个图像 我想在此图像画布上添加自定义文本 现在我正在将多张图像一张一张地上传到画布中 上传图像后 我想在画布上添加自定义文本 var canvas new fabric Canvas c
  • 遍历基于 tidyverse/rlang 的函数的输入值

    我的功能foo非常适合一个输入值为其cat mod争论 但我想知道如何让它接受多个输入cat mod鉴于使用rlang ensym cat mod 在我的函数中 foo lt function data study id cat mod s
  • 如何读取多行原始输入?

    我想创建一个接受多行用户输入的 Python 程序 例如 This is a multilined input It has multiple sentences Each sentence is on a newline 如何获取多行原始
  • 如何使用 Cypress Cucumber 预处理器实现单个测试的重试?

    我目前面临的挑战是实现单独的测试重试 以稳定一小部分特定测试 这些测试依赖于某些后台处理 因此往往不稳定 我将 Cypress 9 2 0 与 TypeScript 和 Cypress Cucumber 预处理器 4 3 1 结合使用 为了
  • 为 RESTful WCF 配置 SSL 绑定。如何?

    我当前的配置如下所示
  • O(nlogn) 算法 - 在二进制字符串中找到三个均匀分布的

    昨天算法考试的时候遇到了这个问题 我不知道答案 这简直让我抓狂 因为它大约值 40 分 我估计全班大部分人都没有正确解决这个问题 因为我在过去 24 小时内还没有想出解决方案 给定一个长度为 n 的任意二进制字符串 如果存在 请在该字符串中
  • 如何从 OpenCV 中已标记的图像中获取区域属性?

    我使用 OpenCV 中的分水岭算法来标记图像 类似于本教程 https docs opencv org 3 4 d3 db4 tutorial py watershed html 这样最后我获得了一个标签数组 其中每个区域都有一个与其标签
  • Python:根据计数条件删除行

    我在过滤时遇到问题pandas数据框 city NYC NYC NYC NYC SYD SYD SEL SEL df city value counts 我想删除计数频率小于 4 的城市行 例如 SYD 和 SEL 在不手动将它们逐个城市投
  • 如何在 iOS 中读取其他应用程序的推送通知

    我想知道如何在 iOS 中读取和获取另一个应用程序的推送通知的内容 例如来自 Facebook Messenger 或 Twitter 的推送通知 我知道这是可能的 因为这正是 Pebble 智能手表 iOS 应用程序的作用 它拦截 iPh
  • 带撇号的 php 参数

    我有带撇号的字符串参数 我需要将其传递到另一个 php 页面 我的代码是 echo
  • 将 Img 源与 php 变量一起使用

    我想在 WP 循环内使用一些缩略图生成的图像 代码如下所示 if thumbnail wpbdp get option use default picture thumbnail http images thumbshots com ima
  • 如何在java中使用^DG命令将图像发送到斑马打印机?

    有谁知道如何在java中将图像 例如 bmp文件 转换为十六进制字符串 以便十六进制字符串可以在 DG命令 zpl中的命令之一 中使用 谢谢 我写了一个java例子可以做到这一点 您还可以创建 ascii 十六进制代码或压缩的 ZPL 代码
  • 构建 WSO2 4.1.x 是否需要 Sun/Oracle JDK?

    Is Sun Oracle JDK构建 WSO2 4 1 x 需要吗 我尝试用OpenJDK 但遇到了以下问题 ERROR Failed to execute goal org apache maven plugins maven comp
  • jQuery if has() 选择器执行操作

    ul li text li ul http jsfiddle net wZ8MC 2 jQuery document ready function if jQuery bad drifting has em jQuery bad drift
  • 如何在正则表达式中使用变量(TCL/Expect)

    我试图弄清楚如何在正则表达式匹配中使用字符串 我在谷歌上搜索了一个小时 想我应该问问专家 这有效 usr bin expect set MYSTR value if regexp nocase MYSTR outcome matchresu
  • 过滤/消除噪音

    问题很简单 如何去除数据中的噪音 我已经制作了一些 x 和 y 值以及一些噪声 这些噪声是我正在处理的数据的总体简化 除了随机噪声之外 我无法使其与我必须处理的噪声相同 我真的不知道我是否需要过滤或平滑 我的文件包含两组需要绘制的数据 并且
  • std::vector 的 MPI_Gatherv 问题

    我无法获取MPI Gatherv使用 std vector 我编写了一个小程序 应该用rank 1的整数填充向量 以避免0 因为向量初始化为0 这只是一个使用 2 个 MPI 进程运行的示例程序 我意识到它的可扩展性不太好 include
  • 作业中存储过程的并行执行 (SQL Server)

    简短的 我有五个存储过程 每个存储过程都没有依赖项 相同的事情是它从五个不同的服务器提取数据 我们只是将其整理并提供给我们的服务器 问题 我们已将这五项任务安排在一个作业中 分为 5 个不同的步骤 我想并行执行它而不是顺序执行 额外的 如果
  • 将 double 转换为 int 的结果是错误的

    当我运行以下代码时 似乎存在某种模糊的舍入错误 int roundedTotal int PriorityJob 100 0 最初PriorityJob 1 4 and roundedTotal未定义 评估PriorityJob 100 0
  • 升级到Spring Boot 1.4.0后,AbstractPlatformTransactionManager中出现NullPointerException

    我已从 Spring Boot 1 3 2 升级到 1 4 0 现在无法启动我的应用程序 我的BeanPostProcessor调用 3d party 开源 Lazy Chopper 当尝试getTransaction 这里失败 publi