我有一些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;这样做的方式。肯定有更好的办法。你能帮我找到吗?也许我只是错过了一些非常明显的东西?
。室
答案 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}
这就是诀窍。但是,我并不完全相信这是最好的解决方案吗?