【问题标题】:Gwt Overlay Compilation error whenever method gets used每当使用方法时,Gwt 覆盖编译错误
【发布时间】: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 中遇到覆盖问题,或者我是否犯了某种我不知道的错误。

亲切的问候, 任何好的指针表示赞赏。

【问题讨论】:

    标签: gwt overlay


    【解决方案1】:
    public final native String getUserName(); /*
                                                 * { return userName; }
                                                 */
    

    这不是有效的 JSNI(getHashedPassword() 中存在同样的问题)。正确的写法是

    public final native String getUserName() /*-{
        return userName;
    }-*/;
    

    您必须以/*-{ 开头并以}-*/; 结尾,并且不能像Javadoc 那样在其间添加*s。

    但是,作为 JS,这没有任何意义,所以虽然它会编译,但它不是你想要的。方法的主体应该是

        return this.userName;
    

    因为 JS 没有像 Java 那样隐含的this

    乍一看,其余的看起来还可以,但是没有合法的JSNI,编译器无法接受。

    【讨论】:

    • 完美。我今晚会试试。并请原谅我对这个问题的无知。我从一个普通的 POJO 开始,并开始使用 cmets 对 eclipse 中自动生成的 gettter 进行切片。现在我看到分号出现在最后并不是任意的。很多很多thnks。
    • 工作正常。谢谢。
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2015-03-22
    相关资源
    最近更新 更多