簡體   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