Внедрение множества украшенных экземпляров с помощью Guice - при смешивании HessianServlet с Guice - PullRequest
4 голосов
/ 13 февраля 2012

С учетом следующего кода в модуле сервлета Guice configureServlets():

serve("/a").with(new Decorator(new A()));
serve("/b").with(new Decorator(new B()));
...
serve("/z").with(new Decorator(new Z()));
...

Каково было бы лучшее / простое решение для правильного введения всего этого? (то есть введение полей в различные декорированные классы A, B, C ...)

Я думал об использовании именованных провайдеров, но я бы предпочел не определять новый класс провайдеров для каждого A, B, C ... Таким образом, идеальное решение было бы общим.


ПО СМЕШИВАНИЮ ГЕССИАНА С РУКОВОДСТВОМ ...

Чтобы уточнить вопрос, реальный код использует веб-сервисы с Hessian. После поиска в сети в настоящее время нет правильного ответа на эту проблему (я видел много уродливых хаков), и решение, данное Гийомом , отвечает всем требованиям именно этого случая.

Подводя итог исходной проблеме: чтобы реализовать веб-сервис с использованием Hessian, нужно реализовать HessianServlet, то есть GenericServlet; однако Guice может связывать только HttpServlet. Хитрость заключалась в том, чтобы реализовать тонкую оболочку HessianHttpServlet:

class HessianHttpServlet extends HttpServlet {
    public HessianHttpServlet(HessianServlet hessianServlet) {
        this.hessianServlet = hessianServlet;
    }
    @Override public void init(ServletConfig config) throws ServletException {
        hessianServlet.init(config);
    }
    @Override public void service(ServletRequest request, ServletResponse response) {                 
        hessianServlet.service(request, response);
    }
}

И звонит:

serve("/a").with(new HessianHttpServlet(new WebServiceA()));

Таким образом, в этом случае полное решение для инъекции WebService X :

void configureServlet() {
    serve("/a").with(new HessianHttpServlet(inject(new WebServiceA())));
    serve("/b").with(new HessianHttpServlet(inject(new WebServiceB())));
    ...
    serve("/z").with(new HessianHttpServlet(inject(new WebServiceZ())));
}
private HessianServlet inject(HessianServlet hessianServlet) {
    requestInjection(hessianServlet);
    return hessianServlet;
}

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Вы можете использовать requestInjection(Object instance) на каждом из ваших декораторов.

1 голос
/ 03 мая 2014

Я создал небольшой проект с открытым исходным кодом, который позволяет легко интегрировать hessian и guice. Вы можете использовать аннотацию на основе конфигурации, как это: WebService:

@HessianWebService
public class UserServiceImpl implements UserService {
    ...
}

Конфигурация Guice:

public class WebServiceGuiceServletContextListener extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(
                /* your guice modules */
                new HessianWebServicesModule("your web service implementations package")
        );
    }
}

или ручным способом с использованием EDSL:

public class WebServiceGuiceServletContextListener extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(
                /* your guice modules */
                new HessianWebServicesModule(){
                    @Override
                    protected void configureHessianWebServices() {
                        serveHessianWebService(UserService.class).usingUrl("/Users");
                    }
                }
        );
    }
}

Более подробная информация, параметры конфигурации и полные примеры доступны здесь: https://bitbucket.org/richard_hauswald/hessian-guice/

...