Как интегрировать гессиан с Guice?
Мы смотрим на технологии для готовящегося проекта, и я действительно хочу использовать Guice в качестве нашей структуры внедрения зависимостей, я также хочу использовать Hessian для обмена данными между клиентом и сервером, но, похоже, он не совместим с Guice.
public class WebMobule extends ServletModule {
@Override
protected void configureServlets() {
serve("/fileupload").with(FileUploadServlet.class);
// this doesn't work! AuthenticationServlet extends HessianServlet
// HessianServlet extends GenericServlet - Guice wants something that extends
// HttpServlet
serve("/authentication").with(AuthenticationServlet.class);
}
Кому-нибудь удалось решить эту проблему - если да, то как ты это сделал?
ура
Фил
3 ответа
Я написал бы собственный HessianHttpServlet, который расширяет HttpServlet и делегирует вызовы метода инкапсулированному HessianServlet. Таким образом, вызов службы Guice будет насыщен, и вы будете использовать поведение HessianServlet.
Это требует некоторой работы, но в основном я решил проблему с этим (спасибо Синтаксис!):
@Singleton
public class AuthenticationWrapperServlet extends HttpServlet {
private static final Logger LOG = Logger.getLogger(HessianDelegateServlet.class);
// this is the HessianServlet
private AuthenticationServlet authenticationServlet;
@Override
public void init(ServletConfig config) throws ServletException {
LOG.trace("init() in");
try {
if (authenticationServlet == null) {
authenticationServlet = new AuthenticationServlet();
}
authenticationServlet.init(config);
} catch (Throwable t) {
LOG.error("Error initialising hessian servlet", t);
throw new ServletException(t);
}
LOG.trace("init() out");
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
try {
authenticationServlet.service(request, response);
} catch (Throwable t) {
LOG.error("Error calling service()", t);
throw new ServletException(t);
}
}
}
Я создал небольшой проект с открытым исходным кодом, который позволяет легко интегрировать гессиан и 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/