2013-02-25 4 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); 

Проблема заключается в том, я на самом деле нужно, что CTOR аргумент. Как я могу сделать его доступным? (Примечание. Я не использую ни одну инфраструктуру 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, который упростит его и уменьшит код шаблона, например. это для весны: http://pastebin.com/MnhWRKd0

+0

За документации это невозможно прикрепить экземпляр. – djechlin

+0

О, вы правы. Вы можете добавить экземпляр 'Restlet', но не' ServerResource'. Не могли бы вы использовать 'Restlet', когда? Если нет, то просто используйте 'doInit' для подключения Connnection из' Context'. – kan

+0

Вы пытались установить его с помощью фильтра (org.restlet.routing.Filter)? – Caleryn