Способ маршалинга / отмены маршалинга строк / объектов через механизм RPC в GWT без использования реального сервлета RPC

Большая часть моего приложения использует GWT-RPC для связи между серветом и клиентом. Однако некоторым классам необходимо создать запрос на получение вручную, "разбивая строку" URL-адреса с различными параметрами, подобными этому ...

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) {
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH
            + "?templateInstanceId=" + templateInstanceId
            + "&fileName=" + pageImage.getImageId()
            + "&isBackground=false"
            + "&cropX=" + pageImage.getCropX()
            + "&cropY=" + pageImage.getCropY()
            + "&cropWidth=" + pageImage.getCropWidth()
            + "&cropHeight=" + pageImage.getCropHeight();
}

Мне было интересно, есть ли способ использовать для этого довольно крутой маршаллер объектов GWT-RPC от GWT?

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) {
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH
            + "?templateInstanceId=" + templateInstanceId
        + "&pageImage=" + SomeGWTClass.toRpcString(pageImage)
       ;
}

Затем на стороне сервлета сделайте это ...

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final String templateInstanceId = req.getParameter("templateInstanceId");
        final String strPageImage= req.getParameter("pageImage");
        **final PageImage pageImage = SomeGWTClass.unmarshallString(PageImage.class,strPageImage);**    
}

person benstpierre    schedule 20.07.2011    source источник


Ответы (2)


Я не уверен, было бы хорошей идеей использовать GWT RPC таким образом. Классы сериализации GWT, расположенные в пакетах com.google.gwt.user.client.rpc и com.google.gwt.server.rpc, являются внутренними классами GWT, и вы не должны вызывать их из кода своего приложения (это нормально, если вы пишете фреймворк общего назначения, и вы готовы настроить его, когда появится новая версия GWT, возможно с критическими изменениями в API этих классов).

Причина, по которой такую ​​универсальную функциональность трудно найти в GWT, заключается в том, что в ней отсутствует поддержка отражения в Java. Однако вы можете перейти на JavaScript, чтобы вернуть некоторую гибкость. Например, если вы можете превратить свой класс PageImage в тип GWT Overlay, вы можете использовать new JSONObject(pageImage).toString() для маршалинга объекта в json. Библиотека JSON, такая как XStream, может превратить эту строку обратно в объект Java на сервере.

См. Этот вопрос для получения подробной информации о технике типа GWT Overlay.

person Tahir Akhtar    schedule 20.07.2011

В принципе, можно сделать что-то подобное, но реализовать это будет довольно сложно. Серверная часть довольно проста, проблема будет на стороне клиента.

Поскольку в GWT отсутствует отражение, он генерирует во время компиляции классы, такие как FieldSerializer. Для любого класса, переданного через службу GWt-RPC, GWT создаст FieldSerializer, который знает, как сериализовать / десериализовать объект.

Итак, чтобы использовать эту функциональность, вам нужно будет создать некую структуру, в которой вы укажете, что хотите сериализовать / десериализовать какой-либо объект, определите свой собственный генератор, который будет генерировать все, что вам нужно, и т. Д.

Но есть и простой способ (но это очень грязный хак, я не рекомендую его использовать, но кого это волнует =). Добавьте классы, которые вы хотите сериализовать, в какую-либо службу GWT-RPC, а затем запустите компилятор с параметром -gen. Он запишет все эти FieldSerializer на диск. Затем вы можете просто включить их в свое приложение и использовать. Но вам нужно будет регенерировать их каждый раз, когда вы меняете сериализованный класс. Это неплохой прием, но мы использовали его несколько раз для отладки.

Так что выбор за вами. Я лично рекомендовал бы забыть о механизме GWT-RPC и использовать оверлейный тип + синтаксический анализ / стрингирование JSON.

person jusio    schedule 23.07.2011