我正在尝试将我的GWT代码与Guice / GIN集成(因为它需要客户端,JVM(共享代码)和运行测试时的不同配置)。我现在得到一个奇怪的错误,在编译时没有找到方法:
[INFO] com.google.gwt.dev.jjs.InternalCompilerException: Unexpected error during visit.
...
[INFO] Caused by: java.lang.UnsatisfiedLinkError: com.google.gwt.user.client.Timer.createCallback(Lcom/google/gwt/user/client/Timer;I)Lcom/google/gwt/core/client/JavaScriptObject;
[INFO] at com.google.gwt.user.client.Timer.createCallback(Native Method)
[INFO] at com.google.gwt.user.client.Timer.scheduleRepeating(Timer.java:121)
[INFO] at ...
com.google.gwt.user.client.Timer驻留在User模块中,Timer.scheduleRepeating()是用Java编写的,并委托给Timer.createCallback(),这是一个" native&#34 ; (JavaScript)方法。所以编译器找到Timer本身和Timer.scheduleRepeating(),但不是本机方法。
是什么导致这个?在尝试使用GIN之前,我没有遇到此问题。
编辑:由于其他人似乎看到了不同的代码,以下是我在查看com.google.gwt.user.client.Timer时所看到的内容:
...
private static native JavaScriptObject createCallback(Timer timer, int cancelCounter) /*-{
return $entry(function() { timer.@com.google.gwt.user.client.Timer::fire(I)(cancelCounter); });
}-*/;
...
public void scheduleRepeating(int periodMillis) {
if (periodMillis <= 0) {
throw new IllegalArgumentException("must be positive");
}
if (isRunning()) {
cancel();
}
isRepeating = true;
timerId = Impl.setInterval(createCallback(this, cancelCounter), periodMillis);
}
...
答案 0 :(得分:1)
您在项目中添加了新的依赖项。
请清理项目并重新编译。
gwt-unitCache
和其他自动生成的存根,如下面的屏幕截图
答案 1 :(得分:1)
所以我只是尝试捕获UnsatisfiedLinkError并忽略它。但是这个也不会直接解决,因为在GWT中没有UnsatisfiedLinkError,所以我只是抓住了“Error”,并检查了类名。然后这一切都奏效了。但是,在我发现令人沮丧之前,我无法覆盖GIN模块上的“provideXXX()”方法(为什么?)。此外,即使允许GIN模块是抽象的,GIN仍然需要公共的无参数构造函数(GIN将永远不会调用,因为抽象类不能实例化!)。