복붙노트

[SPRING] Spring 부트 1.4.0으로 업그레이드 한 후 AbstractPlatformTransactionManager의 NullPointerException

SPRING

Spring 부트 1.4.0으로 업그레이드 한 후 AbstractPlatformTransactionManager의 NullPointerException

Spring Boot 1.3.2에서 1.4.0으로 업그레이드했고 이제는 내 응용 프로그램을 시작하지 못했습니다 - 내 BeanPostProcessor는 3D 파티 오픈 소스 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

내가 여기에 중단 점을 배치하면 로거가 실제로 null이라는 것을 알 수 있지만, 바로 거기에서 LogFactory.getLog (getClass ())를 호출하면 올바른 로거를 얻을 수 있습니다.

어떻게 든 내 bean이 올바른 로거가 초기화되기 전에 그 메소드를 호출하는 것처럼 보입니다.

내가 가진 전체 스택 추적은 다음과 같습니다.

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>

다음은 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으로 업그레이드 한 후에 만 ​​이유가 명확하지 않습니다.

해결법

  1. ==============================

    1.나는 똑같은 문제를 안고있었습니다. 내 잘못은 pointcut 정의가 잘못되어서 TransactionManager에 aspect를 적용하는 것이었다. (나는 표준을 확장했다.) 따라서 null 로거는 CGLIB에서 생성 된 확장 클래스 중 하나였습니다. 실제 빈은 로거를 멋지게 인스턴스화했습니다.

    나는 똑같은 문제를 안고있었습니다. 내 잘못은 pointcut 정의가 잘못되어서 TransactionManager에 aspect를 적용하는 것이었다. (나는 표준을 확장했다.) 따라서 null 로거는 CGLIB에서 생성 된 확장 클래스 중 하나였습니다. 실제 빈은 로거를 멋지게 인스턴스화했습니다.

  2. ==============================

    2.나는 또한이 문제를 겪었다. 제 경우에는 Spring aspect tooling을 활성화하고 프로젝트를 빌드했습니다. 그것은 효과가 있었다.

    나는 또한이 문제를 겪었다. 제 경우에는 Spring aspect tooling을 활성화하고 프로젝트를 빌드했습니다. 그것은 효과가 있었다.

  3. from https://stackoverflow.com/questions/38669278/after-upgrading-to-spring-boot-1-4-0-nullpointerexception-in-abstractplatformtr by cc-by-sa and MIT license