【发布时间】:2018-02-17 18:29:22
【问题描述】:
我有一个由 Spring 代理的服务类,如下所示:
@Service
@Transactional
open class MyService { ... }
如果我删除 open 修饰符,Spring 会抱怨它需要代理类来应用 @Transactional 注释调整。
但是,这会导致在代理服务上调用函数时出现问题,该函数会尝试访问变量:
@Service
@Transactional
open class MyService {
protected val internalVariable = ...
fun doWork() {
internalVariable.execute() // NullPointerException
}
}
internalVariable 被分配为其声明的一部分,没有任何注释(如@Autowired 等),并且在我删除@Transactional 注释和Spring 代理类的要求。
为什么当 Spring 代理/子类化我的服务类时这个变量为空?
【问题讨论】:
-
你是如何测试
MyService的? -
我不知道你在拿到 NPE 后对你的班级究竟做了什么,但请尝试打开“doWork”功能。如果你在另一个 bean 中使用这个 bean,那么方法 'doWork' 将不会被代理,因为它是 final 并且 Spring 创建了一个 CGLib 代理。
-
这很奇怪 - 我实际上可以通过将 property 标记为
open来解决这个问题。所以open protected val internalVariable = ...
标签: spring proxy nullpointerexception kotlin visibility