2010-08-10 26 views
11

我有一堆java自定義標籤,使用彈簧管理bean ..因爲我無法找到一種方法來注入自定義標籤,我創建了一個幫助類,爲我需要的所有spring bean對象提供靜態方法給「getTheObjectINeedBean()」。我不喜歡這種方法。有沒有一個優雅的方式來注入一個Java自定義/簡單標記彈簧管理bean

我真的希望能夠注入託管bean到自定義標籤

彈簧有沒有辦法?至於我的研究去,我知道有沒有辦法做到這一點,因爲自定義標籤是容器管理

感謝,

比利

+0

Duplicate http://stackoverflow.com/questions/1296052/how-to-inject-spring-beans-into-a-jsp-2-0-simpletag – skaffman 2010-08-10 07:18:34

回答

7

你是正確的沒有一個簡單的方法在jstl標籤中使用依賴注入,因爲它們不是由spring管理的,也不是。然而,有(至少)兩種解決方法:

  • @Configurable - AspectJ的允許您在加載時插拔韋弗/編譯時間,所以,即使不是由春實例化對象可以是春天認識。請參閱here

  • 您可以爲您的項目創建基本標記類,並從每個doStartTag(..)方法中調用init(..)方法。在那裏,您可以從pageContext獲得ServletContext,從而獲得彈簧ApplicationContext(通過ApplicationContextUtils)。然後:

    AutowireCapableBeanFactory factory = appCtx.getAutowireCapableBeanFactory(); 
    factory.autowireBean(this); 
    

無論選項是完美的,因爲它們需要或者一些額外的代碼,或者一些「黑魔法」

7

爲了擴大對@ Bozho的帖子,我已經得到了這個,像這樣的工作: (春季3.0沒有ApplicationContextUtils,我能找到)上述工程的描述,然而一些背景知識和額外的代碼片段,很可能的,有用的

public class LocationTag extends RequestContextAwareTag { 
    @Autowired 
    PathComponent path; 

... 
    @Override 
    protected int doStartTagInternal() throws Exception { 
     if (path == null) { 
      log.debug("Autowiring the bean"); 
      WebApplicationContext wac = getRequestContext().getWebApplicationContext(); 
      AutowireCapableBeanFactory acbf = wac.getAutowireCapableBeanFactory(); 
      acbf.autowireBean(this); 
     } 
     return SKIP_BODY; 
    } 
} 
+0

感謝「getRequestContext()。getWebApplicationContext()」解決了我的問題 – TrueCoke 2013-01-04 22:03:09

0

的解決方案。

1)從doStartTag方法調用doStartTagInternal方法。 2)我被迫在調用doStartTag之前先設置pageContext 3)我做了一個bean的查找,而不是自動裝配。對我來說,這似乎更直白:(YourBeanProxy)autowireCapableBeanFactory.getBean( 「yourBeanName」)

希望這額外的信息是非常有用的。

相關問題