2015-04-02 31 views
1

我剛剛發現可以將資源的密鑰從默認「方法名稱」方法更改爲自定義指定密鑰。自定義資源密鑰生成以方便向後兼容

我現在正在考慮將格式切換爲「點分隔」格式(通常用於Java項目中)。

我知道,這可以通過使用@Key("my.new.key")註釋或通過使用@GenerateKeys註釋提供自定義KeyGenerator來實現。

問題是,我正在尋找支持我的新格式以及舊格式的解決方案。這是向後兼容所需的。我將我的工具發佈給公衆,他們可以提供他們自己的屬性文件(以及他們的自定義內容)。這意味着我是而不是能夠更改他們的密鑰以匹配我的新格式。

我現在正在尋找使用新密鑰(如果可用)的解決方案,並在必要時回退到舊密鑰。

我還以爲我被聰明和與此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或者是如果@Key不存在或者是執行我的KeyGenerator之前執行這個GWT檢查只使用。

有誰知道如何解決這個問題?或者也許有人知道另一種解決方案

UPDATE

剛剛發現這個here

@Key(String key)

Specifies the key to use in the external format for this particular method. If not supplied, it will be generated based on the @GenerateKeys annotation, discussed above.

這似乎使我的目標不可達...任何其他建議?

回答

1

您的目標可能無法達到,但肯定不是一件容易的事。雖然GWT編譯了com.google.gwt.i18n.rebind.LocalizableGenerator被調用並執行其I18N魔術。這涉及檢查導致規定的例外的鍵。好消息是,生成器非常強大,您可以推出自定義實現。壞消息是發電機寫起來有點複雜,而且記錄不完善。 official documentation只是簡單地提到了發電機。

因此,在第一次嘗試時,我會建議用您自己的版本替換默認的LocalizableGenerator。在你自己的生成器版本中,你可以抑制異常並添加自己的資源加載邏輯(你最終可能會覆蓋更多的類)。我很確定你可以重寫在本地模塊配置(XML文件)中調用的生成器。雖然我沒有嘗試過。

如果失敗了,我看到的唯一選擇是運行自己的I18N實現。我的意思是一個完整的,你自己的註釋與自定義生成器和連接器來創建必要的輸出...

+0

謝謝你的建議。我會研究它。 – Baz 2015-04-07 08:09:32

+0

我沒有時間和資源來測試它,但您的解決方案似乎是可行的。我希望有一個更簡單的方法來做到這一點,但...無論如何,謝謝! – Baz 2015-04-13 08:01:39