Как интегрировать гессиан с 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/

Другие вопросы по тегам