2017-02-28 4 views
0

Ich versuche GWT Generatoren zu verstehen, aber mit wenigen Problemen konfrontiert. Ich versuche, die Kompilierung in einer App Generatoren angezeigt werden und läuft in diesen Fehler mit -GWT Generator zum Kompilieren

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

Hier ist, was ich habe -

Dies ist, wie ich meine generierte Methode nenne -

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(); 
} 

Generator Klasse -

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; 
    } 
} 

Irgendwelche Ideen, was ich vermisst?

Antwort

2

Ich glaube, Sie müssen auch Null PrintWriter von tryCreate erstellt werden, da es Null zurückgeben kann. Auf der anderen Seite, createSourceWriter wird nicht Null zurückgeben, also keine Notwendigkeit, das zu überprüfen.

Ihre generate-mit ist auch falsch, zumindest für die Probe, die Sie hier haben. Es sollte ein anderes Paket hat (entsprechend Ihre FunctionGenerator Quelle zumindest), com.example.frontend.egenerator, nicht 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> 

Im Allgemeinen Ihre Generatoren nicht in dem client Paket werden sollen, wenn aus keinem anderen Grunde, als verhindert störende Fehler was verlangsamen den Compiler (und wirklich verlangsamen Super-Dev-Modus).


Darüber hinaus könnte die vollständige Protokoll viel helfen, das Problem auf die Spur, wenn auch ohne die Abbildung der Generator richtig wäre es nicht viel ein Fehler sein. Stellen Sie außerdem sicher, dass Sie mit strict kompiliert werden, wenn Sie an Generatoren arbeiten, um sicherzustellen, dass der Compiler so schnell wie möglich ausfällt und Sie beim ersten Fehler anhalten können.


Mit all dies gesagt wurde, neigen dazu, neue Generatoren an dieser Stelle zu vermeiden - sie werden leicht nach unten Super-Dev-Modus verlangsamen (da sie jedes Mal, wenn Sie aktualisieren erneut ausgeführt werden müssen), und sie werden nicht unterstützt in zukünftigen Versionen von GWT. Annotation Processors (auch bekannt als APT) sind der bevorzugte Weg, um dies zu tun, aber in Ihrem Fall können Sie vielleicht auch die Klasse in ant oder maven mit einem Plugin erzeugen.