С учетом следующего кода в модуле сервлета 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;
}