Способ маршалировать / отменять маркер Strings / Objects через механизм RPC в GWT без использования реального сервлета RPC - PullRequest
1 голос
/ 20 июля 2011

Большая часть моего приложения использует 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 GWT-Маршаллер объекта RPC для этого?

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);**    
}

Ответы [ 2 ]

0 голосов
/ 24 июля 2011

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

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

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

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

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

0 голосов
/ 21 июля 2011

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

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

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

...