RPC 调用不起作用。指导 + 调度

Posted

技术标签:

【中文标题】RPC 调用不起作用。指导 + 调度【英文标题】:RPC call doesnt working. GUICE + DISPATCH 【发布时间】:2016-09-15 07:36:32 【问题描述】:

我有一个简单的动作和结果类。处理程序只是在操作中增加变量并在结果中返回它。 动作

public class IncrementCounter implements Action<IncrementCounterResult> 
    private int amount;

    /** For serialization only. */
    public IncrementCounter()

    public IncrementCounter(int amount)
        this.amount = amount;
    

    public int getAmount() 
        return amount;
    

结果

public class IncrementCounterResult implements Result 
    private int amount;
    private int current;

    /** For serialization only. */
    public IncrementCounterResult()

    public IncrementCounterResult(int amount, int current)
        this.amount = amount;
        this.current = current;
    

    public int getAmount() 
        return amount;
    

    public int getCurrent() 
        return current;
    

我有一个动作模块,我在处理程序上绑定动作。 ActionsModule

public class ActionsModule extends ActionHandlerModule 
    @Override
    protected void configureHandlers() 
        bindHandler(IncrementCounter.class, IncrementCounterHandler.class);
    

DispatchServletModule

public class DispatcherServletModule extends ServletModule 
    @Override
    protected void configureServlets() 
        serve("/dispatch").with(GuiceStandardDispatchServlet.class);
    

Handler,在动作中增加字段并在结果中返回。

public class IncrementCounterHandler implements ActionHandler<IncrementCounter, IncrementCounterResult> 
    private int current = 0;


    public Class<IncrementCounter> getActionType() 
        return IncrementCounter.class;
    


    public IncrementCounterResult execute(IncrementCounter action, ExecutionContext context) throws ActionException 
        current += action.getAmount();
        return new IncrementCounterResult(action.getAmount(), current);
    


    public void rollback(IncrementCounter action, IncrementCounterResult result, ExecutionContext context) throws ActionException 
        current = result.getCurrent() - result.getAmount();
    

最后一个是listener

public class RpcCommandGuiceConfig extends GuiceServletContextListener 

    @Override
    protected Injector getInjector() 
        return Guice.createInjector(new ServerDispatchModule(), new ActionsModule());
    

这是我的 web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <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>
    <listener>
        <listener-class>server.RpcCommandGuiceConfig</listener-class>
    </listener>
    <welcome-file-list>
        <welcome-file>Module.html</welcome-file>
    </welcome-file-list>
</web-app>

单击按钮时我调用 dispatch.execute。和代码跳转到 onFailure 部分。 我在日志中有这个:

WARN] 404 - POST /Module/dispatch (127.0.0.1) 1380 bytes
   Request headers
      Host: 127.0.0.1:8888
      User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
      Accept-Encoding: gzip, deflate
      X-GWT-Permutation: HostedMode
      X-GWT-Module-Base: http://127.0.0.1:8888/Module/
      Content-Type: text/x-gwt-rpc; charset=utf-8
      Referer: http://127.0.0.1:8888/Module/Module.html?gwt.codesvr=127.0.0.1:9997
      Content-Length: 238
      Connection: keep-alive
      Pragma: no-cache
      Cache-Control: no-cache

谁能帮忙解决这个问题?

... 这里是gwt文件

<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0//EN"
        "http://google-web-toolkit.googlecode.com/svn/releases/2.0/distro-source/core/src/gwt-module.dtd">
<module>
    <source path="client"/>
    <source path="shared"/>
    <source path="server"/>
    <inherits name='com.google.gwt.user.User'/>
    <inherits name="com.mvp4g.Mvp4gModule"/>
    <inherits name="org.moxieapps.gwt.highcharts.Highcharts"/>
    <inherits name="net.customware.gwt.dispatch.Dispatch" />
    <inherits name="com.google.gwt.inject.Inject" />
    <entry-point class='client.Module'/>
</module>

【问题讨论】:

我认为我的 xml.file 有问题。也许我弄乱了 标签。但是,当我添加到 server.DispatcherServletModule 时出现错误:这个类不能分配给“javax.servlet.Servelt”,但他扩展了 import com.google.inject.servlet.ServletModule;?他是怎么知道这个 javax.servlet 的? server.DispatcherServletModule 这里的错误不能分配给 'javax.servlet.Servlet', 有人可以帮忙吗?我仍然无法解决这个问题( 【参考方案1】:

我认为您需要在 DispatcherServletModule 中的 serve 前面加上模块名称。在您的情况下,它看起来像是在根目录中,所以它只是模块名称:Module:

serve("/Module/dispatch").with(GuiceStandardDispatchServlet.class);

【讨论】:

你刚刚救了我的命)非常感谢。我花了一整天都没有解决这个问题,今天早上你帮助了我。谢谢

以上是关于RPC 调用不起作用。指导 + 调度的主要内容,如果未能解决你的问题,请参考以下文章

GWT Java rpc 调用工作;但是,替换 GWTBootstrap - rpc 调用不起作用

当我更改端点时,GWT RPC 调用不起作用

GWT RPC 调用在编译模式下不起作用

使用逗号运算符在 redux 工具包中的同一调度中调用多个减速器不起作用

Laravel 调度程序自定义 Cron 表达式不起作用

Livewire 队列作业调度 afterRespone() 不起作用