如何解决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
。.是否有解决方法?
解决方法
删除代码中的final
。您正在将@Transactional
与CGLIB
一起使用。 CGLIB
的工作方式是通过扩展类来创建代理。由于以下方法是final方法,因此无法扩展它,因为final类无法扩展。
@Transactional(rollbackFor = Exception.class)
public final void method2() {
method1();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。