Я только недавно обнаружил, что вы можете изменить ключ ресурса по умолчанию по методу «имя метода» на специально указанный ключ.Создание пользовательских ключей ресурсов для облегчения обратной совместимости
Теперь я думаю о переключении формата в «разделенный точкой» формат (который обычно используется в 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.
который, кажется, чтобы моя цель недостижима ... Любые другие предложения?
Благодарим за предложение. Я посмотрю. – Baz
У меня нет времени и ресурсов, чтобы проверить его на данный момент, но ваше решение кажется выполнимым. Хотелось бы, чтобы был более простой способ сделать это, хотя ... Спасибо в любом случае! – Baz