GWT Generatorで私の問題を解決するのを手伝ってくれませんか? 説明させてください。
コンパイル時にウィジェット (定義済みの値を持つ ListBox) を生成したいと考えており、そのためにGWT Generatorを使用しています。私のソリューションは DevMode で期待どおりに動作し (プロジェクトを で実行するとmvn gwt:run
)、生成されたリストボックスが画面に表示されます。しかし、コードをコンパイルして「本番モード」で実行すると( command を使用)、代わりに「値なし」のmvn clean gwt:compile jetty:run-war
アイテムが1つしかないダムリストボックスが表示されます。
問題の理由について 1 つの考えがあります。プロジェクトでGINを使用しています。空のリストボックスを、GIN インジェクションではなく Deferred Binding を使用して生成されたリストボックスに置き換えるという事実にもかかわらず、おそらく実行時の置換を何らかの形で防ぎます。空のテスト プロジェクトでリストボックスを試してみました。すべてがDev ModeとProduction Modeの両方で希望どおりに機能しました。しかし、私の作業プロジェクトでは失敗します。
これが私の実現です:
package com.test.generated;
import com.google.gwt.user.client.ui.IsWidget;
public interface IMySelectBox extends IsWidget {}
私の空の選択ボックス:
package com.test.generated;
import com.google.gwt.user.client.ui.ListBox;
/**
* <p>Dumb listbox. It should be replaced with generated file.</p>
*
*/
public class MySelectBox implements IMySelectBox {
@Override
public ListBox asWidget() {
ListBox listBox = new ListBox();
listBox.addItem("no-value","no-value");
return listBox;
}
}
私のジェネレーター:
package com.test.generated;
import java.io.PrintWriter;
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.NotFoundException;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;
/**
* Generates the ListBox and populates it
*
*/
public class SelectBoxGenerator extends Generator {
/**
* {@inheritDoc}
*/
@Override
public String generate(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException {
try {
JClassType classType = context.getTypeOracle().getType(typeName);
return this.getSourceWriter(classType, context, logger);
} catch (NotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* Generates the source code of the List box.
*/
private String getSourceWriter(JClassType classType, GeneratorContext context, TreeLogger logger) {
final String packageName = classType.getPackage().getName();
final String className = classType.getSimpleSourceName() + "GeneratedImpl";
PrintWriter printWriter = context.tryCreate(logger, packageName, className);
if (printWriter == null) {
// source code has already been generated, abort
return null;
}
ClassSourceFileComposerFactory composer = new ClassSourceFileComposerFactory(packageName, className);
// Extends
composer.setSuperclass(classType.getName());
// Implements interface IMySelectBox
composer.addImplementedInterface(IMySelectBox.class.getSimpleName());
// Imports
composer.addImport(ListBox.class.getName());
// Class body
SourceWriter src = composer.createSourceWriter(context, printWriter);
src.println("@Override");
src.println("public ListBox asWidget() {");
src.println("ListBox sb = new ListBox();");
// ...here I generate values for the selectbox during compilation time.
src.println("return sb;");
src.println("}");
src.commit(logger);
System.out.println("Generating for: " + className);
// return the fully qualifed name of the generated class
return packageName + "." + className;
}
}
これは、module.gwt.xmlファイルで置換を宣言する方法です。
<generate-with class="com.test.generated.SelectBoxGenerator">
<when-type-assignable class="com.test.generated.IMySelectBox" />
</generate-with>
そして、生成された ListBox を通常どおり使用します。
IMySelectBox mySelectBox = GWT.create(MySelectBox.class);
anyPanel.add(mySelectBox);
ご覧のとおり、ここでは GIN にはまったく触れません。GIN を使用して、モジュールとビューを挿入します。GIN の Web サイトでIssue 95を見つけました。おそらく私のケースに関連していると思われます。
どんな助けでも本当にうれしく思います。説明、ヒント、回避策、提案は大歓迎です!
事前にどうもありがとうございました!