Spring Boot中的消息本地化

时间:2017-06-27 05:37:54

标签: java spring spring-boot

我有一些springboot应用程序。有许多模块,它们根据情况以不同的方式组装。在其中,我有一些例外,其中一些将在UI中可见。这些例外应该是本地化的。

基本上

 spring-boot-fat-jar
     module-user.jar
          resources
               message.properties
          classes
               UserService.class
               UserConflictException.class
     module-auth.jar
          resources
               message.properties
          classes
               NotAuthorizedException.class

我确实有特定的例外(有一条消息,例如&#34;你不能删除用户X,因为它们仍然被指定为Y&#34组的管理员),这很容易本地化 - 使用基本上抛出:< / p>

 throw new UserConflictException(
     msgSrc,
     "USER.DELETE.CONFLICT_HAS_GROUPS"
 );

这是有效的,因为存储消息的属性文件和抛出异常的代码(在这种情况下)在同一位置(即spring boot fat jar中的相同jar文件)。

但是,如果我想抛出一个&#34; NotAuthorizedException&#34;,它基本上只是说&#34;你没有被授权&#34; ....然后该类是可见的,但消息不是。显然,我不想在每个message.properties文件中重复该消息。

相反,我希望累积类路径上的所有消息。所有消息代码都是分层/命名空间,所以没有碰撞的风险,真的。

显然,我可以通过类路径扫描收集所有这些消息,然后从中实例化我自己的消息源......但这很可能不是正确的&#34; spring-booty&#34;这样做的方式。肯定有更好的办法。你能帮我找到吗?也许我只是错过了一些非常明显的东西?

。室

1 个答案:

答案 0 :(得分:0)

我有一个现在有效的解决方案,并且只是稍微丑陋 - 我实际上进行了类路径扫描(使用快速类路径扫描程序)并将找到的消息添加到

ReloadableResourceBundleMessageSource 
像这样:

@Bean
public MessageSource globalMessageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    FastClasspathScanner fcs = new FastClasspathScanner();
    fcs.matchFilenamePattern("i18n/.*/messages\\.properties", new FileMatchContentsProcessor() {
        @Override
        public void processMatch(String relativePath, byte[] fileContents) throws IOException {
            try {
                relativePath = relativePath.substring(0, relativePath.length()-11);
                messageSource.addBasenames(relativePath);
                log.info("found messages: "+relativePath);
            } catch (Exception e2) {
                log.error("error processing mail template: "+relativePath,e2);
            }
        }
    });
    fcs.scan();
    return messageSource;
}

鉴于消息在:

ressources/i18n/${module_name}

这就是诀窍。但是,我并不完全相信这是最好的解决方案吗?