Spring CGLIB,事务和私有最终字段初始化

我的Spring Boot应用程序中具有以下类层次结构:

@Override
public void launchServer() {
    try {
        ChannelFuture serverChannelFuture = serverBootstrap.bind(hostAddress).sync();
        log.debug("TCP Server is STARTED : port {}",hostAddress.getPort());

        serverChannel = serverChannelFuture.channel().closeFuture().sync().channel();
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        shutdownQuietly();
    }
}

在这种情况下,一切正常。

但是当我在public abstract class A { private final ObjectMapper objectMapper = new ObjectMapper(); public void method1(Object object) { this.objectMapper.writeValueAsString(object); } } @Component public class B extends A { public void method2() { method1(); } } 声明中添加@Transactional(rollbackFor = Exception.class)注释时,例如:

method2()

并执行public abstract class A { private final ObjectMapper objectMapper = new ObjectMapper(); public void method1() { this.objectMapper; // always NULL } } @Component public class B extends A { @Transactional(rollbackFor = Exception.class) public void method2() { method1(); } } 并在method2()中以NullPointerException失败,因为method1()this.objectMapper

即使添加了NULL,如何让Spring正确初始化private final ObjectMapper objectMapper

此外,在使用@Transactional(rollbackFor = Exception.class)注释的情况下,@Transactional的类为this,而没有注释的只是普通的B$$EnhancerBySpringCGLIB。因此,似乎CGLIB无法正确初始化B。.是否有解决方法?

iCMS 回答:Spring CGLIB,事务和私有最终字段初始化

删除代码中的final。您正在将@TransactionalCGLIB一起使用。 CGLIB的工作方式是通过扩展类来创建代理。由于以下方法是final方法,因此无法扩展它,因为final类无法扩展。

@Transactional(rollbackFor = Exception.class)

public final void method2() {
    method1();
}
本文链接:https://www.f2er.com/1670380.html

大家都在问