2015-04-02 3 views
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 либо используется только если @Key нет или что эта проверка GWT выполняется перед моим KeyGenerator выполняется ,

Кто-нибудь знает, как это решить? Или, может быть, кто-то знает другое решение?

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

+0

У меня нет времени и ресурсов, чтобы проверить его на данный момент, но ваше решение кажется выполнимым. Хотелось бы, чтобы был более простой способ сделать это, хотя ... Спасибо в любом случае! – Baz

 Смежные вопросы

  • Нет связанных вопросов^_^