2013-02-25 7 views
10

otrzymuję ten błąd w restlet:Restlet zasobów serwera z parametrami konstruktora potrzebne

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

I wiem dokładnie dlaczego. To dlatego, że mój konstruktor wygląda następująco:

public UnsubscribeForwardUIResource(MySQLConnectionPool connectionPool) { 

I Restlet uzyskuje dostęp do zasobów tak:

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

Problem jest rzeczywiście trzeba, że ​​konstruktor argument. Jak mogę to zrobić? (Uwaga: nie używam żadnej architektury IOC, tylko wiele argumentów ctor, ale jest to w rzeczywistości wzorzec IOC).

Odpowiedz

10

Możesz użyć kontekstu, aby przekazać kontekstowe atrybuty do instancji zasobu.

Z ServerResource API doc:

Po instancji przy użyciu konstruktora domyślnego, ostateczną Resource.init (Context, Zapytanie, Response) metoda jest wywoływana, ustawienie kontekstowe, żądania i odpowiedzi. Możesz przechwycić to przez przesłonięcie metody Resource.doInit().

Więc w momencie mocowania:

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

Na swojej UnsubscribeForwardUIResource klasie będziesz musiał przenieść kod inicjalizacji z konstruktora do de doInit metody:

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

Jeśli nie korzystasz z IoC, powinieneś zrobić to ręcznie, np. możesz dołączyć instancję Restletu zamiast klasy. Możesz użyć atrybutu Context, aby pobrać atrybuty.

Ale może lepiej wykorzystać pojemnik IoC, który uprości go i zredukuje kod na płycie głównej, np. to jest na wiosnę: http://pastebin.com/MnhWRKd0

+0

Per dokumentacji to nie można dołączyć instancji. – djechlin

+0

Och, masz rację. Możesz dołączyć instancję 'Restlet', ale nie' ServerResource'. Czy możesz użyć 'Restlet' kiedy? Jeśli nie, po prostu użyj 'doInit', aby połączyć połączenie z' Kontekstu'. – kan

+0

Czy próbowałeś dołączyć go za pomocą filtra (org.restlet.routing.Filter)? – Caleryn

Powiązane problemy