Ресурс сервера-рестарта с необходимыми параметрами-конструкторами

Получение этой ошибки в 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).

Ответ 1

Вы можете использовать контекст для передачи атрибутов контекста вашему экземпляру ресурса.

Из документа ServerResource API:

После создания экземпляра с использованием конструктора по умолчанию вызывается окончательный метод 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
}

Ответ 2

Если вы не используете IoC, вы должны сделать это вручную, например. вы можете прикрепить экземпляр Restlet вместо класса. Вы можете использовать Context для извлечения атрибутов.

Но, возможно, имеет смысл использовать контейнер IoC, который упростит его и уменьшит код шаблона, например. это для Spring: http://pastebin.com/MnhWRKd0