Учитывая следующий код в модуле сервлета Guice configureServlets()
:Инъекционных много украшенных экземпляров с Guice - при смешивании HessianServlet с Guice
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 .. . Идеальное решение было бы таким образом общим.
НА СМЕСЬ Мешковины С Guice ...
Чтобы уточнить вопрос, реальный код использует веб-сервисы с Гессом. После копания в сети в настоящее время нет правильный ответ на эту проблему (я видел много уродливых хаков), и решение, данное Guillaume подходит для счета в этом точном случае.
Чтобы подвести итог оригинальной проблеме: для реализации веб-сервиса с использованием 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;
}
Простите мое невежество, но что это за предмет Decorator? Не можете ли вы просто привязать подачу («/ a») с помощью (A.class)? Затем инъекция на A будет выполнена автоматически. То же самое касается B, C, Z. Я чувствую, что у меня что-то не хватает. –
Ну, декоратор здесь, чтобы добавить общую функциональность поверх всех украшенных классов A, B, C ... Добавление непосредственно этой функции к A, B, C нарушит преимущество наличия этого декоратора. Кроме того, декоратор может быть изменен динамически; здесь я взял простой пример только с одним декоратором. –