【发布时间】:2020-08-28 03:03:12
【问题描述】:
我的 Spring Boot 应用程序中有以下类层次结构:
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();
}
}
在这种情况下一切正常。
但是当我在method2() 声明中添加@Transactional(rollbackFor = Exception.class) 注释时,例如:
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(),它在method1() 中以NullPointerException 失败,因为this.objectMapper 是NULL;
即使添加了@Transactional(rollbackFor = Exception.class),如何让Spring正确初始化private final ObjectMapper objectMapper?
此外,在@Transactional 注释的情况下,this 的类是B$$EnhancerBySpringCGLIB,而没有注释只是普通的B。所以,看起来 CGLIB 无法正确初始化 private final ObjectMapper objectMapper.. 有什么解决方法可以解决吗?
【问题讨论】:
-
请参阅deinum.biz/2020-07-03-Autowired-Field-Null/#aop 以获得更广泛的解释。主要是代理问题,把
final关键字从method2去掉,否则不行。
标签: java spring spring-boot spring-data-jpa cglib