2013-02-25 18 views
10

Ottenere questo errore nel Restlet:risorse del server Restlet con parametri del costruttore necessaria

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

E so esattamente perché. E 'perché il mio costruttore si presenta così:

public UnsubscribeForwardUIResource(MySQLConnectionPool connectionPool) { 

E Restlet accede alla risorsa in questo modo:

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

Il problema è che ho effettivamente bisogno che l'argomento ctor. Come posso renderlo accessibile? (Nota che non sto usando alcun framework IOC, solo un sacco di argomenti per i Ctor ma questo è in effetti un pattern IOC).

risposta

10

È possibile utilizzare il contesto per passare atributes di contesto all'istanza della risorsa.

Dal ServerResource API doc:

dopo l'istanza utilizzando il costruttore predefinito, il Resource.init finale (Context, Request, Response) viene richiamato il metodo, l'impostazione del contesto, richiesta e risposta. È possibile intercettarlo sovrascrivendo il metodo Resource.doInit().

Così, al momento di attacco:

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

A vostra classe UnsubscribeForwardUIResource dovrete spostare il codice di inizializzazione dal costruttore a de doInit metodo:

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

Se non si utilizza IoC, è necessario farlo manualmente, ad es. è possibile collegare l'istanza di Restlet al posto della classe. È possibile utilizzare Context per recuperare gli attributi.

Ma forse ha più senso utilizzare un contenitore IoC che lo semplificherà e ridurrà il codice boilerplate, ad es. questo è per la primavera: http://pastebin.com/MnhWRKd0

+0

Per la documentazione è non è possibile allegare un'istanza. – djechlin

+0

Oh, hai ragione. È possibile collegare l'istanza 'Restlet', ma non' ServerResource'. Potresti usare il 'Restlet' quando? In caso contrario, basta usare 'doInit' per collegare la connessione dal' Contesto'. – kan

+0

Hai provato a collegarlo utilizzando un filtro (org.restlet.routing.Filter)? – Caleryn