1

リソースのキーをデフォルトの「メソッド名」メソッドからカスタム指定のキーに変更できることを最近発見しました。

現在、形式を「ドット区切り」形式 (通常は Java プロジェクトで使用されます) に切り替えることを考えています。

これは、アノテーションを使用するか、アノテーションを使用し@Key("my.new.key")てカスタムを提供することで実現できます。KeyGenerator@GenerateKeys

問題は、新しい形式と古い形式をサポートするソリューションを探していることです。これは下位互換性のために必要です。ツールを公開すると、彼らは独自のプロパティ ファイルを (カスタム コンテンツと共に) 提供できます。これは、新しい形式に合わせてキーを変更できないことを意味します。

現在、新しいキー (利用可能な場合) を使用し、必要に応じて古いキーにフォールバックするソリューションを探しています。

私は賢いと思って、これを思いついたKeyGenerator

public class MyKeyGenerator implements KeyGenerator
{
    private PropertyResourceBundle bundle;
    
    @Override
    public String generateKey(Message msg)
    {
        if(bundle == null)
        {
            try
            {
                File file = urlToResourceFile(Text.class.getName()); /* Finds the properties file */
                bundle = new PropertyResourceBundle(new FileInputStream(file));
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        
        String key = msg.getKey();
        
        if(key != null)
        {
            if(bundle.containsKey(key))
                return key;
        }
        
        return msg.getMethodName();
    }
}

プロパティファイルに新しいキーが存在するかどうかを確認します。ある場合は返却し、そうでない場合は古いキーを返却してください。

ただし、次のエラーが表示されます。

Computing all possible rebind results for 'my.package.here.i18n.Text'
        Rebinding my.package.here.i18n.Text
        Invoking generator com.google.gwt.i18n.rebind.LocalizableGenerator
            Processing interface my.package.here.i18n.Text
                Generating method body for generalSuccess()
                    [ERROR] No resource found for key 'general.success'
com.google.gwt.i18n.rebind.AbstractResource$MissingResourceException: No resource found for key 'general.success'
    at com.google.gwt.i18n.rebind.MessagesMethodCreator.createMethodFor(MessagesMethodCreator.java:1086)
    at com.google.gwt.i18n.rebind.AbstractLocalizableImplCreator.delegateToCreator(AbstractLocalizableImplCreator.java:501)
    at com.google.gwt.i18n.rebind.MessagesImplCreator.emitMethodBody(MessagesImplCreator.java:92)
    at com.google.gwt.user.rebind.AbstractGeneratorClassCreator.genMethod(AbstractGeneratorClassCreator.java:277)
    at com.google.gwt.user.rebind.AbstractGeneratorClassCreator.emitMethods(AbstractGeneratorClassCreator.java:239)
    at com.google.gwt.user.rebind.AbstractGeneratorClassCreator.emitClass(AbstractGeneratorClassCreator.java:118)
    at com.google.gwt.i18n.rebind.AbstractLocalizableImplCreator.generateConstantOrMessageClass(AbstractLocalizableImplCreator.java:225)
    at com.google.gwt.i18n.rebind.LocalizableGenerator.generate(LocalizableGenerator.java:151)
    at com.google.gwt.i18n.rebind.LocalizableGenerator.generate(LocalizableGenerator.java:124)
    at com.google.gwt.core.ext.IncrementalGenerator.generateNonIncrementally(IncrementalGenerator.java:40)
    at com.google.gwt.dev.javac.StandardGeneratorContext.runGeneratorIncrementally(StandardGeneratorContext.java:676)
    at com.google.gwt.dev.cfg.RuleGenerateWith.realize(RuleGenerateWith.java:41)
    at com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind(StandardRebindOracle.java:79)
    at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:276)
    at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:265)
    at com.google.gwt.dev.DistillerRebindPermutationOracle.getAllPossibleRebindAnswers(DistillerRebindPermutationOracle.java:91)
    at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.handleGwtCreate(UnifyAst.java:387)
    at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.handleMagicMethodCall(UnifyAst.java:465)
    at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.endVisit(UnifyAst.java:255)
    at com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:244)
    at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
    at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:117)
    at com.google.gwt.dev.jjs.ast.JCastOperation.traverse(JCastOperation.java:65)
    at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
    at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:117)
    at com.google.gwt.dev.jjs.ast.JDeclarationStatement.traverse(JDeclarationStatement.java:48)
    at com.google.gwt.dev.jjs.ast.JModVisitor$ListContextImmutable.traverse(JModVisitor.java:170)
    at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemoveImmutable(JModVisitor.java:336)
    at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:83)
    at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
    at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:138)
    at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:134)
    at com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:82)
    at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
    at com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:449)
    at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:418)
    at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
    at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
    at com.google.gwt.dev.jjs.impl.UnifyAst.mainLoop(UnifyAst.java:940)
    at com.google.gwt.dev.jjs.impl.UnifyAst.exec(UnifyAst.java:665)
    at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.precompile(JavaToJavaScriptCompiler.java:672)
    at com.google.gwt.dev.jjs.JavaScriptCompiler.precompile(JavaScriptCompiler.java:34)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:271)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:223)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:139)
    at com.google.gwt.dev.Compiler.run(Compiler.java:167)
    at com.google.gwt.dev.Compiler.run(Compiler.java:132)
    at com.google.gwt.dev.Compiler$1.run(Compiler.java:99)
    at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:55)
    at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:50)
    at com.google.gwt.dev.Compiler.main(Compiler.java:106)

KeyGeneratorこれは、 my が存在しない場合にのみ使用されるか@Key、 my が実行される前にこの GWT チェックが実行されることを示唆しているようKeyGeneratorです。

これを解決する方法を知っている人はいますか?それとも、誰かが別の解決策を知っていますか?

アップデート

ここでこれを見つけました:

@Key(String key)

この特定のメソッドの外部形式で使用するキーを指定します。指定されていない場合は@GenerateKeys、上記の注釈に基づいて生成されます。

私の目標を達成できないように見える...他の提案はありますか?

4

1 に答える 1

1

あなたの目標は達成不可能ではないかもしれませんが、それは確かに簡単なことではありません。GWT コンパイル中にcom.google.gwt.i18n.rebind.LocalizableGeneratorが呼び出され、その I18N マジックが実行されます。これには、指定された例外の原因となっているキーのチェックが含まれます。良いニュースは、ジェネレーターが非常に強力で、カスタム実装を展開できることです。悪いニュースは、ジェネレーターの記述がやや複雑であり、十分に文書化されていないことです。公式ドキュメントでは、ジェネレーターについて簡単に説明しています。

したがって、最初の試みとして、デフォルトのLocalizableGeneratorを独自のバージョンに置き換えることをお勧めします。ジェネレーターの独自のバージョンでは、例外を抑制し、独自のリソース読み込みロジックを追加できます (さらにいくつかのクラスをオーバーライドすることになる可能性があります...)。ローカル モジュール構成 (XML ファイル) で呼び出されるジェネレーターをオーバーライドできると確信しています。私はそれを試していませんが。

それが失敗した場合、私が見る唯一のオプションは、独自の I18N 実装を実行することです。つまり、必要な出力を作成するためのカスタム ジェネレーターとリンカーを備えた独自の注釈です。

于 2015-04-07T06:33:36.737 に答える