非Spring架构的NiFi项目中如何实现Java注解的国际化功能
非Spring环境下NiFi注解国际化可行方案
Java注解的属性值要求必须是编译期常量,你之前直接调用ResourceBundle.getString报错是正常的语法限制,没有绕过的可能,以下是两个可落地的实现方案:
方案1:修改注解读取逻辑(可控DtoFactory.java的情况优先选择)
你当前的注解读取逻辑是直接返回注解的原始值,只需要在这一步增加占位符解析逻辑即可,完全符合你想用${}占位符的需求:
- 直接在注解中写占位符格式的key:
@CapabilityDescription("${text}") - 修改
getCapabilityDescription方法,增加占位符匹配、国际化翻译逻辑即可,代码示例如下:
private String getCapabilityDescription(final Class<?> cls) { final CapabilityDescription capabilityDesc = cls.getAnnotation(CapabilityDescription.class); if (capabilityDesc == null) { return null; } String rawValue = capabilityDesc.value(); // 匹配${xxx}格式的占位符 if (rawValue.startsWith("${") && rawValue.endsWith("}")) { String key = rawValue.substring(2, rawValue.length() - 1); // 调用你自己的ResourceBundle读取逻辑 try { return MyResourceBundle.mybundle.getString(key); } catch (MissingResourceException e) { // 找不到对应key时返回原始值兜底 return rawValue; } } return rawValue; }
这个方案改动最小,也不需要调整原有注解的定义,适配成本极低。
方案2:无法修改NiFi原生DtoFactory的情况
如果你使用的是NiFi官方的DtoFactory没有修改权限,可以通过编译期代码生成的方式实现:
- 自定义过渡注解,比如
@I18nCapabilityDescription(key = "text"),加在你自己开发的Processor类上 - 借助Maven的
maven-processor-plugin插件,在编译阶段扫描所有带自定义注解的类,自动读取Messages.properties里对应key的翻译值,生成带常量翻译的@CapabilityDescription注解写到Processor类上 - 注意提前配置Maven资源文件的编码为UTF-8,避免编译期乱码
内容的提问来源于stack exchange,提问作者Robinyer
相关产品推荐
相关产品推荐

