2013-02-25 6 views
10

Erhalten dieser Fehler in Restlet:Restlet Server-Ressource mit Konstruktorparameter benötigt

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

Und ich weiß genau, warum. Es ist, weil mein Konstruktor wie folgt aussieht:

public UnsubscribeForwardUIResource(MySQLConnectionPool connectionPool) { 

Und Restlet greift auf die Ressource wie so:

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

Problem ist ich eigentlich, dass Ctor Argument benötigen. Wie kann ich es zugänglich machen? (Hinweis: Ich verwende kein IOC-Framework, nur eine Menge von ctor-Argumenten, aber das ist tatsächlich ein IOC-Muster).

Antwort

10

Sie können den Kontext verwenden, um Kontextattribute an Ihre Ressourceninstanz zu übergeben.

Vom ServerResource API doc:

Nach Instanziierung des Standardkonstruktors verwenden, die endgültige Resource.init (Context, Request, Response) -Methode aufgerufen wird, den Kontext, Anfrage und Antwort zu setzen. Sie können dies abfangen, indem Sie die Resource.doInit() -Methode überschreiben.

Also, an Befestigungszeit:

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

Zu Ihrer UnsubscribeForwardUIResource Klasse werden Sie den Code für die Initialisierung von Konstruktor bewegen müssen Verfahren de 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

Wenn Sie IoC nicht verwenden, sollten Sie dies manuell tun, z. Sie könnten die Restlet-Instanz anstelle der Klasse anhängen. Sie können die Context verwenden, um Attribute abzurufen.

Aber vielleicht hat es mehr Sinn, einen IoC-Behälter zu verwenden, der es vereinfacht und den Standardcode reduziert, z.B. Dies ist für das Frühjahr: http://pastebin.com/MnhWRKd0

+0

Per Dokumentation es Es ist nicht möglich, eine Instanz anzuhängen. – djechlin

+0

Oh, Sie haben Recht. Sie könnten 'Restlet'-Instanz anhängen, aber nicht' ServerResource'. Könntest du das "Restlet" wann benutzen? Wenn nicht, dann verwende einfach "doInit", um die Verbindung von dem "Kontext" zu verbinden. – kan

+0

Haben Sie versucht, es mit einem Filter (org.restlet.routing.Filter) zu verbinden? – Caleryn