3

我使用 resty gwt 进行所有服务器通信。我想要一些显示操作正在进行的指标。

我考虑了两种方法:

  • 进度条,将显示进度百分比;
  • 动画,将在操作进行时显示,但没有任何影响。

我假设我需要添加带有回调的自定义过滤器。我想触发事件,例如:RestyGwtComunicationStartand RestyGwtComunicationEnd,或者回调触发onComunicationStartedand onComunicationEnded。我想在一个地方声明这个,RestyGWT Dispatcher 配置。此外,如果有错误,我想获取错误。

但我不知道从哪里开始。文档中没有关于它的消息。

我可以请你帮忙吗?我怎样才能做到这一点?

4

4 回答 4

0

因此,如果您想知道请求已发送,则由您在 GWT 应用程序中处理该请求。您可以在触发请求时发送事件。你有多种方法可以做到这一点。

查看文档中的 Request Dispatcher https://resty-gwt.github.io/documentation/restygwt-user-guide.html

然后,如果您想获取进度信息,因为 HTTP 调用是同步的。所以没有办法轻易做到这一点。

我一直这样做的方式如下:

1) 创建第一个调用以使用 POST 在后端启动处理,这将返回您的处理 ID

2) 然后对您的处理 ID 执行 GET 操作,以返回进度。一旦进度为 100%,它将返回结果的 ID

3) 使用结果 ID 获取结果

(您最终可以将 2 和 3 混合在一起,并在同一个 DTO 中的进度为 100% 时返回结果)

另一种选择是通过将信息从后端推送到前端(html5 websocket)来替换 2)

于 2016-07-13T10:03:57.730 回答
0

有人已经将其作为对 resty 的拉取请求。猜猜你可以试一试:

https://github.com/resty-gwt/resty-gwt/pull/151

于 2016-07-13T11:26:24.970 回答
0

不幸的是,官方文档中没有描述“调度程序/回调过滤器”功能。但我可以建议下一个解决方案(此代码应放在模块的 EntryPoint 实现中):

public void onModuleLoad() {
    //...

    //used to show busy indicator before send HTTP request        
    DispatcherFilter busyIndicatorDispatcherFilter = new DispatcherFilter() {
        @Override
        public boolean filter(Method method, RequestBuilder builder) {
            BusyIndicator.show();
            return true;
        }
    };
    //used to show busy indicator after HTTP response recieved
    CallbackFilter busyIndicatorCallbackFilter = new CallbackFilter() {
        @Override
        public RequestCallback filter(Method method, Response response, RequestCallback callback) {
            BusyIndicator.hide();
            return callback;
        }
    };
    //registering FilterawareDispatcher (and busy indicator filters) as default Dispatcher
    Defaults.setDispatcher(new DefaultFilterawareDispatcher(
            busyIndicatorDispatcherFilter,
            new DefaultDispatcherFilter(new DefaultCallbackFactory(busyIndicatorCallbackFilter))));

    //...
}
于 2016-07-15T09:25:09.313 回答
0

不幸的是,我没有得到足够的答案,所以我开发了自己的解决方案。

起初我已将 Resty 配置添加RestyGwtConfig到我的模块配置中

public class ClientModule extends AbstractPresenterModule {
    @Override
    protected void configure() {
        bind(RestyGwtConfig.class).asEagerSingleton();
        install(new DefaultModule.Builder()
        .defaultPlace(Routing.HOME.url)
        .errorPlace(Routing.ERROR.url)
        .unauthorizedPlace(Routing.LOGIN.url)
        .tokenFormatter(RouteTokenFormatter.class).build());
        install(new AppModule());
        install(new GinFactoryModuleBuilder().build(AssistedInjectionFactory.class));
        bind(ResourceLoader.class).asEagerSingleton();
    }
}

然后我为我所有的resty gwt通信请求设置了Custom distpatcher。

import org.fusesource.restygwt.client.Defaults;
import org.fusesource.restygwt.client.Resource;
import pl.korbeldaniel.cms.shared.ServiceRouting;
import com.google.gwt.core.client.GWT;
import com.google.inject.Inject;

public class RestyGwtConfig {
    @Inject
    public RestyGwtConfig(RestyDispatcher dispatcher) {
        Defaults.setDispatcher(dispatcher);
    }
}

然后我添加了自定义过滤器 ( ProgressIndicatorFilter) 来处理通信的开始结束回调

import org.fusesource.restygwt.client.Method;
import org.fusesource.restygwt.client.dispatcher.DefaultFilterawareDispatcher;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestException;
import com.google.inject.Inject;

public class RestyDispatcher extends DefaultFilterawareDispatcher {
    @Inject
    public RestyDispatcher(ProgressIndicatorFilter progressIndicatorFilter) {
        addFilter(progressIndicatorFilter);
    }
}

在覆盖的过滤器类方法中filter,我添加了一个事件触发器(eventBus.fireEvent(new IndicatorEvent("Rest-Gwt Comunication started"));)并注册了回调,这是整个代码:

import org.fusesource.restygwt.client.Method;
import org.fusesource.restygwt.client.dispatcher.DispatcherFilter;
import pl.korbeldaniel.cms.client.template.progressIndicator.IndicatorEvent;
import com.google.gwt.http.client.RequestBuilder;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;

class ProgressIndicatorFilter implements DispatcherFilter {
    private AssistedInjectionFactory factory;
    private EventBus eventBus;

    @Inject
    public ProgressIndicatorFilter(AssistedInjectionFactory factory, EventBus eventBus) {
        this.factory = factory;
        this.eventBus = eventBus;
    }
    @Override
    public boolean filter(Method method, RequestBuilder builder) {
        builder.setCallback(factory.createProgressIndicatorCallback(method));
        eventBus.fireEvent(new IndicatorEvent("Resty-Gwt Comunication started"));
        return true;
    }
}

注册回调不能直接完成,比如

new ProgressIndicatorDispatcherCallback()

因为我使用依赖注入。所以我创建了一个工厂来协助注射,如下所示:

public interface AssistedInjectionFactory {
    ProgressIndicatorDispatcherCallback createProgressIndicatorCallback(Method method);
}

在这里这里您可以找到更多辅助注射信息。

这是回调代码:

class ProgressIndicatorDispatcherCallback implements RequestCallback {
    private RequestCallback requestCallback;
    private EventBus eventBus;

    @Inject
    public ProgressIndicatorDispatcherCallback(@Assisted Method method, EventBus eventBus) {
        this.requestCallback = method.builder.getCallback();
        this.eventBus = eventBus;
    }
    @Override
    public void onResponseReceived(Request request, Response response) {
        endComunicationFireIvent();
        requestCallback.onResponseReceived(request, response);
    }
    @Override
    public void onError(Request request, Throwable exception) {
        endComunicationFireIvent();
        requestCallback.onError(request, exception);
    }
    private void endComunicationFireIvent() {
        eventBus.fireEvent(new IndicatorEvent("Rest-Gwt Comunication ended"));
    }
}
于 2016-07-18T08:31:53.287 回答