0

我们一直在使用 GWT-Dispatch 来支持使用命令模式的 RPC 调用。我们现在需要转移到 GWTP,因为 Dispatch 已被吸收到该项目中。似乎一切都很好。问题是我们无法再获得 DispatchAsync 对象。在 Dispatch 中,获取默认实现非常简单:

private final DispatchAsync dispatchAsync = GWT.create(DefaultDispatchAsync.class);

这不再有效。DefaultDispatchAsync 已被弃用,当我们使用建议的替代品 (RpcDispatchAsync) 时,它看起来像这样:

private final DispatchAsync dispatchAsync = GWT.create(RpcDispatchAsync.class);

我们得到以下错误:

 Rebind result 'com.gwtplatform.dispatch.rpc.client.RpcDispatchAsync' has no default (zero   argument) constructors.

有谁知道如何做到这一点?我知道如果我们重写所有页面以使用它在 Presenter 中可用的 GWTP MVP 模式,但是将事情转移到使用完整的 GWTP 是一个漫长的过程,如果我们不能让 RPC 调用并快速工作,那将是一个项目的问题。

在此先感谢-希望这很容易。

4

1 回答 1

0

DispatchAsync 不再通过延迟绑定生成。因此,您不能使用 GWT.create 来实例化它。

GWTP Dispatch 大量使用 GIN/Guice。所以我建议你使用这个依赖注入框架来让 GWTP Dispatch 工作。

这是一个示例,它提供了对 DispatchAsync 的轻松访问(无需重写所有页面以使用 GWTP MVP 模式):

[注意:本例使用 gwtp dispatch 1.0.3]

客户:

MyClientModule.java - 为 DispatchAsync 配置注入规则

import com.google.gwt.inject.client.AbstractGinModule;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.gwtplatform.dispatch.client.DefaultExceptionHandler;
import com.gwtplatform.dispatch.client.DefaultSecurityCookieAccessor;
import com.gwtplatform.dispatch.client.ExceptionHandler;
import com.gwtplatform.dispatch.client.RpcDispatchAsync;
import com.gwtplatform.dispatch.client.actionhandler.ClientActionHandlerRegistry;
import com.gwtplatform.dispatch.client.actionhandler.DefaultClientActionHandlerRegistry;
import com.gwtplatform.dispatch.shared.DispatchAsync;
import com.gwtplatform.dispatch.shared.SecurityCookie;
import com.gwtplatform.dispatch.shared.SecurityCookieAccessor;

public class MyClientModule extends AbstractGinModule {

    private static final String COOKIE_NAME = "JSESSIONID";

    @Override
    protected void configure() {
        bindConstant().annotatedWith(SecurityCookie.class).to(COOKIE_NAME);
        bind(ExceptionHandler.class).to(DefaultExceptionHandler.class);
        bind(SecurityCookieAccessor.class).to(DefaultSecurityCookieAccessor.class);
        bind(ClientActionHandlerRegistry.class).to(DefaultClientActionHandlerRegistry.class);
        bind(DispatchAsync.class).toProvider(DispatchAsyncProvider.class).in(Singleton.class);
    }

    public static class DispatchAsyncProvider implements Provider<DispatchAsync> {

        private final DispatchAsync fDispatchAsync;

        @Inject
        public DispatchAsyncProvider(ExceptionHandler eh, SecurityCookieAccessor sca, ClientActionHandlerRegistry cahr) {
            this.fDispatchAsync = new RpcDispatchAsync(eh, sca, cahr);
        }

        @Override
        public DispatchAsync get() {
            return fDispatchAsync;
        }
    }
}

MyClientInjector.java - 注入器提供对 DispatchAsync 的访问

import com.google.gwt.inject.client.GinModules;
import com.google.gwt.inject.client.Ginjector;
import com.gwtplatform.dispatch.shared.DispatchAsync;

@GinModules(MyClientModule.class)
public interface MyClientInjector extends Ginjector {

    DispatchAsync getDispatchAsync();

}

服务器:

MyGuiceServletContextListener.java - 为 servlet 创建注入器,它接收命令和服务器模块,其中定义了(客户端)命令和(服务器端)处理程序之间的绑定。

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;

public class MyGuiceServletContextListener extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServerModule(), new DispatchServletModule());
    }
}

DispatchServletModule.java - 配置 servlet,它接收命令

import com.google.inject.servlet.ServletModule;
import com.gwtplatform.dispatch.server.guice.DispatchServiceImpl;
import com.gwtplatform.dispatch.server.guice.HttpSessionSecurityCookieFilter;
import com.gwtplatform.dispatch.shared.Action;
import com.gwtplatform.dispatch.shared.SecurityCookie;

public class DispatchServletModule extends ServletModule {

    @Override
    public void configureServlets() {
        bindConstant().annotatedWith(SecurityCookie.class).to("JSESSIONID");
        filter("*").through(HttpSessionSecurityCookieFilter.class);
        serve("/" + Action.DEFAULT_SERVICE_NAME + "*").with(DispatchServiceImpl.class);
    }

}

ServerModule.java - (客户端)命令和(服务器端)处理程序之间的绑定

import com.gwtplatform.dispatch.server.guice.HandlerModule;

public class ServerModule extends HandlerModule {

    @Override
    protected void configureHandlers() {
        bindHandler(YourCommand.class, YourHandler.class);
    }
}

web.xml - 告诉网络服务器使用 MyGuiceServletContextListener

<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!--
This Guice listener hijacks all further filters and servlets. Extra
filters and servlets have to be configured in your
ServletModule#configureServlets() by calling
serve(String).with(Class<? extends HttpServlet>) and
filter(String).through(Class<? extends Filter)
-->
<listener>
    <listener-class>de.gwtpdispatch.server.MyGuiceServletContextListener</listener-class>
</listener>

用法

现在您可以使用延迟绑定创建注入器并访问 DispatchAsync 实例:

MyClientInjector injector = GWT.create(MyClientInjector.class);
injector.getDispatchAsync().execute(...YourCommand...)

(并且:不要忘记在您的项目中包含 GIN 和 Guice 的 jar,并将 gin-module 添加到项目的 gwt.xml 中)

我希望这个解释足够详细。快乐编码:)

于 2014-01-28T17:09:54.267 回答