我正在尝试了解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;
}
}
任何想法,我缺少什么?
答案 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中的类。