问题描述
我的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();
}