GWT生成器获取编译时间

时间:2017-02-28 02:48:02

标签: java gwt gxt gwtp

我正在尝试了解GWT生成器,但面临的问题很少。我试图使用生成器在应用程序中显示编译时间并遇到此错误 -

Rebind result 'com.example.client.Function' must be a class

这是我的 -

这就是我调用生成的方法的方法 -

Function b = GWT.create(Function.class);
label.setText(b.getBuildTime());

gwt.xml -

<generate-with class="example.frontend.client.gin.FunctionGenerator">
    <when-type-assignable class="com.example.frontend.client.gin.Function" />
</generate-with>

Function.java

package com.example.frontend.client.gin;

public interface Function{
    public String getBuildTime();
}

生成器类 -

package com.example.frontend.egenerator;

import java.io.PrintWriter;
import java.util.Date;

import com.google.gwt.core.ext.Generator;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;
import com.example.frontend.client.gin.Function;

public class FunctionGenerator extends Generator {
    private static final String IMPL_TYPE_NAME = Function.class.getSimpleName() + "Impl";
    private static final String IMPL_PACKAGE_NAME = Function.class.getPackage().getName();


    @Override
    public String generate(final TreeLogger logger, final GeneratorContext context, final String requestedClass) throws UnableToCompleteException {
        TypeOracle typeOracle = context.getTypeOracle();
        JClassType functionType = typeOracle.findType(requestedClass);
        assert Function.class.equals(functionType.getClass());
        ClassSourceFileComposerFactory composerFactory = new      ClassSourceFileComposerFactory(IMPL_PACKAGE_NAME, IMPL_TYPE_NAME);
        composerFactory.addImport(Function.class.getCanonicalName());
        composerFactory.addImplementedInterface(Function.class.getName());
        PrintWriter printWriter = context.tryCreate(logger, IMPL_PACKAGE_NAME, IMPL_TYPE_NAME);
        SourceWriter sourceWriter = composerFactory.createSourceWriter(context, printWriter);
        if(sourceWriter != null) {
            sourceWriter.print("public String getBuildTime() {");
            sourceWriter.print("    return \"" + new Date() + "\" ;");
            sourceWriter.print("}");
            sourceWriter.commit(logger);
        }
        return IMPL_PACKAGE_NAME + "." + IMPL_TYPE_NAME;
    }
}

任何想法,我缺少什么?

1 个答案:

答案 0 :(得分:2)

我相信您还需要检查由PrintWriter创建的tryCreate,因为它可能会返回null。另一方面,createSourceWriter不会返回null,因此不需要null检查。

您的generate-with也是错误的,至少对于您在这里的样本而言。它应该有一个不同的包(至少根据您的FunctionGenerator来源),com.example.frontend.egenerator,而不是com.example.frontend.client.gin

<generate-with class="com.example.frontend.egenerator.FunctionGenerator">
    <when-type-assignable class="com.example.frontend.client.gin.Function" />
</generate-with>

一般情况下,您的生成器不应该在client包中,除非出于其他原因而不是防止虚假错误导致编译器速度变慢(并且真的减慢了超级开发模式)

除此之外,完整的日志可以帮助很多人追踪问题,虽然没有正确映射生成器,但不会出现太多错误。还要确保在处理生成器时打开strict进行编译,以确保编译器尽快失败,并且可以在第一次出错时停止。

所有这些都表示,此时往往会避开新的Generators - 它们会稍微降低Super Dev Mode(因为每次刷新时都必须重新运行),并且将来不会支持它们。 GWT。注释处理器(也称为APT)是执行此操作的首选方法,但在您的情况下,您也可能只能使用插件生成ant或maven中的类。