2013-02-25 45 views
10

得到這個錯誤的Restlet:的Restlet服務器資源所需

ForwardUIApplication ; Exception while instantiating the target server resource. 
java.lang.InstantiationException: me.unroll.forwardui.server.ForwardUIServer$UnsubscribeForwardUIResource 

而且我知道爲什麼。這是因爲我的構造是這樣的:

public UnsubscribeForwardUIResource(MySQLConnectionPool connectionPool) { 

而且的Restlet訪問資源,像這樣:

router.attach(Config.unsubscribeUriPattern(), UnsubscribeForwardUIResource.class); 

問題是,我確實需要一個構造函數的參數。我如何使它可以訪問? (注意我沒有使用任何IOC框架,只是很多ctor參數,但實際上這是一個IOC模式)。

回答

10

您可以使用上下文將上下文屬性傳遞到資源實例。

ServerResource API doc

使用默認構造,最終Resource.init實例化後(上下文,請求,響應)方法被調用時,設定的上下文中,請求和響應。您可以通過重寫Resource.doInit()方法來攔截該方法。

所以,在安裝時間:

router.getContext().getAttributes().put(CONNECTION_POOL_KEY, connectionPool); 
router.attach(Config.unsubscribeUriPattern(), UnsubscribeForwardUIResource.class); 

在你UnsubscribeForwardUIResource類,你就必須從構造函數移動初始化代碼脫doInit方法:

public UnsubscribeForwardUIResource() { 
    //default constructor can be empty 
} 

protected void doInit() throws ResourceException { 

    MySQLConnectionPool connectionPool = (MySQLConnectionPool) getContext().getAttributes().get(CONNECTION_POOL_KEY); 

    // initialization code goes here 
} 
1

如果您不使用IoC,應該手動執行,例如,你可以附加Restlet實例而不是類。您可以使用Context來檢索屬性。

但是,也許它更多地利用IoC容器來簡化它並減少樣板代碼,例如,這是針對Spring的:http://pastebin.com/MnhWRKd0

+0

每文檔它不可能附加一個實例。 – djechlin 2013-02-28 17:16:30

+0

哦,你是對的。你可以附加'Restlet'實例,但不要附加'ServerResource'。你可以在什麼時候使用'Restlet'?如果不是,那麼只需使用'doInit'來連接Connnection和'Context'。 – kan 2013-02-28 22:44:30

+0

您是否嘗試過使用過濾器(org.restlet.routing.Filter)來附加它? – Caleryn 2013-03-01 17:19:46

相關問題