繁体   English   中英

以编程方式启动的 Tomcat 服务器和 Tomcat 之间的 Spring 自动装配空字段

[英]Spring autowired null fields between Tomcat server and Tomcat launched programmatically

  1. 我正在通过 IntelliJ IDE 中的 org.apache.catalina.startup.Tomcat 类启动 Spring Web 应用程序。
  2. 在自动装配的服务之间做一些处理。
  3. 在某个时刻,一个服务的字段都是空的。

我可以通过在类中使用这些字段的公共 getter 来绕过这个问题,但我想知道为什么。

 this.persist.doSomeProcess(); // NullPointerException

但:

 this.getPersist().doSomeProcess(); // with public MyField getPersist() it works fine

问题是,当我通过 IntelliJ 在普通 Tomcat 上运行我的项目时,一切正常,我不需要公共 getter。

IntelliJ 的版本并不重要,因为自 8 个月前的版本以来就是这种情况。

这是我拥有的两个不同的调用堆栈(左一个适用于真正的 tomcat),右升一个 NPE: 左边的一个是不需要公共 getter 并且字段不为空的调用堆栈

我遇到了这个问题,因为我在 TransactionTemplate 中放置了 @Transactional 注释而不是编程调用。

我真的对这件事很好奇。

我找到了问题的根源。 在非公共方法中执行期间,这些字段为空。 一旦它们被设置为 public,Spring 就可以正确连接它的 Proxy。 在 TomcatRunner 中。

我不知道为什么使用包私有方法执行它可以在 IDE 中启动的真正 Tomcat 上工作。

但是对于 TomcatRunner,我们需要将使用字段的方法设置为 public 以使其工作。

如果方法是最终的,我们也会遇到同样的问题。 但在这种情况下,无论是在真正的 Tomcat 还是 TomcatRunner 上。

干杯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM