2017-10-12 237 views
0

我有一個Wicket應用程序,我試圖實現可以遠程更改的單獨配置。無論如何,這是最終的目標。在沒有web.xml的情況下將CayenneRuntime用於web應用程序

我想要做的是通過手動啓動而不是使用web.xml文件來設置Cayenne。我嘗試了一堆不同的東西,但我不確定我完全理解上下文是如何應用於所有線程的。

我已經嘗試在我的應用程序類中創建ServerRuntime。我也嘗試了每個頁面使用的自定義BasePage類。我可以得到它的那種做對的BasePage以下的工作,但它是不一致的:

public class BasePage .... 
    public static ServerRuntime runtime = new ServerRuntime("cayenne-config.xml");//This is in my BasePage class, but I've also tried this in the Application class 

    @Override 
    protected void init() { 
BaseContext.bindThreadObjectContext(Application.runtime.getContext());//This is in my BasePage class 
    } 

就像我說的,那樣的作品,但它是不相符的。我一直在

BaseContext.getThreadObjectContext(); 

錯誤獲取的錯誤是這樣的:我好像

java.lang.IllegalStateException: Current thread has no bound ObjectContext. 

無法找到這麼多的信息。我試着做這樣的事情,並使用這些訪問運行時,但沒有任何工作一致。

WebUtil.setCayenneRuntime(this.getServletContext(), runtime); 
BaseContext.bindThreadObjectContext(WebUtil.getCayenneRuntime(((Application)getApplication()).getServletContext()).getContext()); 

任何幫助將不勝感激。

回答

0

我想出了一個辦法來自己做。

我正在擴展CayenneFilter並重寫init方法。

在那裏我複製了幾乎他們的確切代碼。我將能夠檢查這裏的任何配置並加載正確的xml文件。這顯然不是解決方案,但絕對是一個進步,也可能是我最終這樣做的方式。

無論哪種方式,這是我測試的工作。

@WebFilter(filterName = "cayenne-config", displayName = "cayenne-config", urlPatterns = {"/*"}) 
public class TestFilter extends CayenneFilter 
{ 
    @Override 
    public void init(FilterConfig config) throws ServletException 
    { 
     this.checkAlreadyConfigured(config.getServletContext()); 
     this.servletContext = config.getServletContext(); 
     WebConfiguration configAdapter = new WebConfiguration(config); 
     Collection modules = configAdapter.createModules(new Module[]{new WebModule()}); 
     ServerRuntime runtime = new ServerRuntime("cayenne-test.xml", (Module[])modules.toArray(new Module[modules.size()])); 
     WebUtil.setCayenneRuntime(config.getServletContext(), runtime); 
    } 
} 

我不認爲是必要的註釋(我確定這一切在web.xml文件),但我想我會離開這裏,所以你可以看到,它正在改變。

如果我能找到更改config(FilterConfig)值(init參數)的方法,那麼我可以將其更改爲我想要使用的xml文件的名稱,而不是覆蓋整個方法。我無法弄清楚如何做到這一點,但我會在稍後再看。

如果有人有另一個更好的答案,我很樂意聽到它。

+0

CayenneFilter和線程綁定的ObjectContext只是Cayenne如何被引導的一個例子。如果您正在使用任何類型的依賴注入框架,則可以完全取消該方法,並將ServerRuntime單例創建爲另一個DI管理的服務。然後根據需要創建ObjectContexts(例如,用於讀取的一個共享ObjectContext,以及用於寫入的短生活頁面或方法範圍的ObjectContexts) –

+0

@andrus_a,謝謝。目前我們不使用DI框架,而是我們有興趣介紹,我會繼續使用DataContext.getThreadObjectContext()嗎?我們有很多應用程序使用它,所以這將是一個相當大的改變。我沒有做過很多DI,所以任何資源 – adpro

+0

當然,DI是一個超越短小帖子的大話題,有Spring [Boot]可用,還有bootique。io - 一款基於Google Guice DI的開源項目,我參與其中,可以提供卡宴整合功能。如果需要,DataContext.getThreadObjectContext()API仍然可用。它簡單易用。請記住,它不是唯一的選擇,您可以調整應用程序中的ObjectContext範圍以適應特定的需求。 –

相關問題