【发布时间】:2016-11-25 08:24:37
【问题描述】:
我正在尝试测试摆脱 gwt-rpc 入口点,而是使用基于 JAX-RS / JSON 的入口点。
为此,我只是使用本机 GWT RequestBuilder api。
根据接下来引用的文档。 http://www.gwtproject.org/doc/latest/tutorial/JSON.html
我面临的问题是编译器似乎不喜欢让我使用任何覆盖 API,即任何没有要编译的 Java 代码并且被标记为本地的方法。
我当然在使用最新最好的 gwt 2.8 编译器。
如果我按如下方式编写叠加层。
public class UserLoginGwtRpcMessageOverlay extends JavaScriptObject {
/**
* Mandatory PROTECTED no arguments constructor.
*/
protected UserLoginGwtRpcMessageOverlay() {
super();
}
public final native String getUserName(); /*
* { return userName; }
*/
public final native String getHashedPassword(); /*
* { return hashedPassword;
* }
*/
public final String toStringOverlay() {
return getUserName() + "-" + getHashedPassword();
}
该类将无法编译。 它不会编译,因为我的人工 toString 正在使用覆盖 API,例如(getUserName())。
如果我将这些调用从类中取出,编译器不会中断对类的处理。
更进一步,如果我尝试按如下方式进行休息:
private void invokeRestService() {
try {
// (a) prepare the JSON request to the server
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, JSON_URL);
// (b) send an HTTP Json request
Request request = builder.sendRequest(null, new RequestCallback() {
// (i) callback handler when there is an error
public void onError(Request request, Throwable exception) {
LOGGER.log(Level.SEVERE, "Couldn't retrieve JSON", exception);
}
// (ii) callback result on success
public void onResponseReceived(Request request, Response response) {
if (200 == response.getStatusCode()) {
UserLoginGwtRpcMessageOverlay responseOverlay = JsonUtils
.<UserLoginGwtRpcMessageOverlay>safeEval(response.getText());
LOGGER.info("responseOverlay: " + responseOverlay.getUserName());
} else {
LOGGER.log(Level.SEVERE, "Couldn't retrieve JSON (" + response.getStatusText() + ")");
}
}
});
} catch (RequestException e) {
LOGGER.log(Level.SEVERE, "Couldn't execute request ", e);
}
}
同样,编译将失败。 这又是我尝试使用 getUserName() 的结果。
特别是,以下代码行会破坏编译器。
LOGGER.info("responseOverlay: " + responseOverlay.getUserName());
鉴于编译器正在运行空指针异常,除此之外没有其他提示:
<no source info>: <source info not available>
我怀疑我正在处理编译器错误,或者以某种方式被取消支持并且其 API 仍然存在的功能。但与此同时,我会感到惊讶,因为我认为覆盖是 GWT 的核心部分,这应该可以正常工作。所以我更有可能在我没有发现的代码中有一些错误。
QUOTE FULL 编译错误:
[INFO] --- gwt-maven-plugin:2.8.0:compile (gwt-compile) @ jntl-expenses-frontend --- [INFO] 编译模块 org.gwtproject.tutorial.TodoList [INFO] 编译 1 个排列 [INFO] 编译排列 0... [INFO] [ERROR] An 发生内部编译器异常 [INFO] com.google.gwt.dev.jjs.InternalCompilerException:意外错误 访问期间。 [信息] 在 com.google.gwt.dev.jjs.ast.JVisitor.translateException(JVisitor.java:111) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:276) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265) [信息] 在 com.google.gwt.dev.jjs.impl.MakeCallsStatic$CreateStaticImplsVisitor.visit(MakeCallsStatic.java:222) [信息] 在 com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:777) [信息] 在 com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:127) [信息] 在 com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:122) [信息] 在 com.google.gwt.dev.jjs.impl.MakeCallsStatic$CreateStaticImplsVisitor.getOrCreateStaticImpl(MakeCallsStatic.java:240) [信息] 在 com.google.gwt.dev.jjs.impl.Devirtualizer$RewriteVirtualDispatches.ensureDevirtualVersionExists(Devirtualizer.java:271) [信息] 在 com.google.gwt.dev.jjs.impl.Devirtualizer$RewriteVirtualDispatches.endVisit(Devirtualizer.java:160) [信息] 在 com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:268) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265) [信息] 在 com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118) [信息] 在 com.google.gwt.dev.jjs.ast.JBinaryOperation.traverse(JBinaryOperation.java:89) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265) [信息] 在 com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118) [信息] 在 com.google.gwt.dev.jjs.ast.JExpressionStatement.traverse(JExpressionStatement.java:42) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:88) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:331) [信息] 在 com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:92) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273) [信息] 在 com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:139) [信息] 在 com.google.gwt.dev.jjs.ast.JIfStatement.traverse(JIfStatement.java:53) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:88) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:331) [信息] 在 com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:92) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273) [信息] 在 com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:139) [信息] 在 com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:135) [信息] 在 com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:83) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265) [信息] 在 com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:786) [信息] 在 com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:778) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor$ListContextImmutable.traverse(JModVisitor.java:169) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemoveImmutable(JModVisitor.java:336) [信息] 在 com.google.gwt.dev.jjs.ast.JClassType.traverse(JClassType.java:147) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265) [信息] 在 com.google.gwt.dev.jjs.ast.JProgram.visitModuleTypes(JProgram.java:1284) [信息] 在 com.google.gwt.dev.jjs.ast.JProgram.traverse(JProgram.java:1249) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265) [信息] 在 com.google.gwt.dev.jjs.impl.Devirtualizer.execImpl(Devirtualizer.java:409) [信息] 在 com.google.gwt.dev.jjs.impl.Devirtualizer.exec(Devirtualizer.java:324) [信息] 在 com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.normalizeSemantics(JavaToJavaScriptCompiler.java:489) [信息] 在 com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:364) [信息] 在 com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:272) [信息] 在 com.google.gwt.dev.CompilePerms.compile(CompilePerms.java:198) [信息] 在 com.google.gwt.dev.ThreadedPermutationWorkerFactory$ThreadedPermutationWorker.compile(ThreadedPermutationWorkerFactory.java:50) [信息] 在 com.google.gwt.dev.PermutationWorkerFactory$Manager$WorkerThread.run(PermutationWorkerFactory.java:74) [INFO] at java.lang.Thread.run(Thread.java:745) [INFO] 原因: java.lang.NullPointerException [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361) [信息] 在 com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273) [INFO] ... 59 更多 [INFO] [ERROR] : [INFO] [ERROR] at UserLoginGwtRpcMessageOverlay.java(23): org.gwtproject.tutorial.client.overlay.UserLoginGwtRpcMessageOverlay.getUserName()Ljava/lang/String; [INFO] com.google.gwt.dev.jjs.ast.JMethod [INFO]
[错误] 在 TodoList.java(148): responseOverlay.getUserName() [INFO]
com.google.gwt.dev.jjs.ast.JMethodCall [信息] [错误] 在 TodoList.java(148): "responseOverlay:" + responseOverlay.getUserName() [信息]
com.google.gwt.dev.jjs.ast.JBinaryOperation [信息] [错误] 在 TodoList.java(148): "responseOverlay:" + responseOverlay.getUserName() [信息]
com.google.gwt.dev.jjs.ast.JExpressionStatement [信息]
[错误] 在 TodoList.java(145): { [INFO] final UserLoginGwtRpcMessageOverlay responseOverlay = (UserLoginGwtRpcMessageOverlay) JsonUtils.safeEval(response.getText()); [信息] TodoList.$clinit(); [INFO] "responseOverlay:" + responseOverlay.getUserName(); [信息] } [信息] com.google.gwt.dev.jjs.ast.JBlock [信息]
[错误] 在 TodoList.java(145): if (200 == response.getStatusCode()) { [INFO] 最终 UserLoginGwtRpcMessageOverlay responseOverlay = (UserLoginGwtRpcMessageOverlay) JsonUtils.safeEval(response.getText()); [信息] TodoList.$clinit(); [INFO] "responseOverlay:" + responseOverlay.getUserName(); [信息] } 否则 { [INFO] TodoList.$clinit(); [信息] Level.$clinit(); [信息]
"无法检索 JSON (" + response.getStatusText() + ")"; [信息] } [信息] com.google.gwt.dev.jjs.ast.JIfStatement [信息]
[错误] 在 TodoList.java(144): { [INFO] if (200 == response.getStatusCode()) { [INFO] 最终 UserLoginGwtRpcMessageOverlay responseOverlay = (UserLoginGwtRpcMessageOverlay) JsonUtils.safeEval(response.getText()); [信息] TodoList.$clinit(); [INFO] "responseOverlay:" + responseOverlay.getUserName(); [信息] } else { [INFO] TodoList.$clinit(); [信息] Level.$clinit(); [INFO] "无法检索 JSON (" + response.getStatusText() + ")"; [信息] } [信息] } [信息]
com.google.gwt.dev.jjs.ast.JBlock [信息] [错误] 在 TodoList.java(144): { [INFO] if (200 == response.getStatusCode()) { [INFO] 最终 UserLoginGwtRpcMessageOverlay responseOverlay = (UserLoginGwtRpcMessageOverlay) JsonUtils.safeEval(response.getText()); [信息] TodoList.$clinit(); [INFO] "responseOverlay:" + responseOverlay.getUserName(); [信息] } else { [INFO] TodoList.$clinit(); [信息] Level.$clinit(); [INFO] "无法检索 JSON (" + response.getStatusText() + ")"; [信息] } [信息] } [信息]
com.google.gwt.dev.jjs.ast.JMethodBody [信息] [错误] 在 TodoList.java(144): org.gwtproject.tutorial.client.TodoList$3.onResponseReceived(Lcom/google/gwt/http/client/Request;Lcom/google/gwt/http/client/Response;)V [INFO] com.google.gwt.dev.jjs.ast.JMethod [INFO]
[错误] 在 TodoList.java(136): org.gwtproject.tutorial.client.TodoList$3(最终扩展对象 实现 RequestCallback) [INFO]
com.google.gwt.dev.jjs.ast.JClassType [信息] [错误] 在 未知(0):[信息]
com.google.gwt.dev.jjs.ast.JProgram
是否有其他人在 GWT 2.8 中遇到覆盖问题,或者我是否犯了某种我不知道的错误。
亲切的问候, 任何好的指针表示赞赏。
【问题讨论】: