自定义资源密钥生成,以促进向后兼容

巴兹

我最近才发现,您可以将资源的密钥从默认的“方法名称”方法更改为自定义的密钥。

我现在正在考虑将格式切换为“点分隔”格式(通常在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不存在my的情况下才使用my ,或者在执行my之前KeyGenerator执行了此GWT检查

有谁知道如何解决这个问题?也许有人知道另一种解决方案?

更新

刚刚在这里找到这个

@Key(String key)

指定用于此特定方法的外部格式的键。如果未提供,它将根据@GenerateKeys上面讨论注释生成

哪个似乎无法实现我的目标?还有其他建议吗?

阿德里安·B。

您的目标可能并非遥不可及,但绝对不是一件容易的事。在GWT编译时,com.google.gwt.i18n.rebind.LocalizableGenerator被调用并执行其I18N魔术。这涉及检查导致所述异常的密钥。好消息是,生成器非常强大,您可以滚动自定义实现。坏消息是,生成器编写起来有些复杂,而且没有很好的文档记录。官方文件中提到的发电机只是简单。

因此,在第一次尝试中,我建议用您自己的版本替换默认的LocalizableGenerator然后,在您自己的生成器版本中,您可以抑制该异常并添加您自己的资源加载逻辑(您最终可能会覆盖更多的类...)。我非常确定您可以覆盖在本地模块配置(XML文件)中调用的生成器。虽然我还没有尝试过。

如果失败,我看到的唯一选择是运行您自己的I18N实现。我的意思是一个完整的,带有自定义生成器和链接器的您自己的注释,以创建必要的输出...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

自定义Java公共密钥生成(比特币)

来自分类Dev

获取自定义资源和自定义密钥转换字符串为“ ResourceManager”

来自分类Dev

如何使自定义类与For Each兼容?

来自分类Dev

使用自定义生成的许可证密钥保护Google表格的安全

来自分类Dev

使用Spring JDBC模板检索自定义的自动生成的密钥

来自分类Dev

自定义SwaggerDocument生成

来自分类Dev

矩形-指定自定义ID密钥

来自分类Dev

自定义装置资源名称

来自分类Dev

DSC自定义资源依赖项

来自分类Dev

角度资源自定义网址

来自分类Dev

自定义iOS框架中的资源

来自分类Dev

用于自定义资源的活动?

来自分类Dev

创建自定义JNDI资源

来自分类Dev

自定义视图接受别名资源

来自分类Dev

Chef自定义资源属性

来自分类Dev

自定义资源cloudformation的堆栈策略

来自分类Dev

设置原始资源的自定义名称

来自分类Dev

AngularJS对资源的自定义验证

来自分类Dev

自定义视图接受别名资源

来自分类Dev

建模Kubernetes自定义类型资源

来自分类Dev

自定义嵌套资源的路由

来自分类Dev

提供活动的自定义名称并选择在Android Studio中创建新项目时是否包括向后应用程序兼容性

来自分类Dev

烧瓶重定向后返回自定义http代码

来自分类Dev

Android:更改方向后删除的自定义对象更改

来自分类Dev

自定义自动生成的Swagger定义

来自分类Dev

joomla自定义组件翻译兼容性

来自分类Dev

Android自定义actionBarStyle兼容性错误

来自分类Dev

自定义过滤器不兼容?

来自分类Dev

调整自定义类以使其与CoreData兼容