【问题标题】:Handle no such messageexception in Message source Spring在消息源 Spring 中不处理此类消息异常
【发布时间】:2015-04-15 10:39:46
【问题描述】:

我正在使用 Spring Message 源来加载我的属性文件。

String placeDetails = messageSource.getMessage(code,
                        null, new Locale(locale.toLowerCase()));

属性文件中的示例条目:

BNA=Nashville:Nashville:USA

属性文件名:

placeDetails_locale.properties

messagesource.getMessage 方法返回分配的值 ex If code "BNA" 字符串“placeDetails”将保存“Nashville:Nashville:USA”。如果在属性文件中找不到代码,它会抛出“No such message found exception”。但我需要处理这种情况,例如如果在那种情况下没有找到消息我有将默认值设置为 placeDetails。

我尝试过的方法: 1.我需要先检查如果该属性文件中的代码可用,那么我只需要调用get messagesource方法。但我不知道如何通过消息源检查值是否存在 2.我需要在catch块中定义默认值查找。

我尝试了第二次但没有按预期工作。帮助我了解如何通过消息源检查属性文件中代码的可用性(第一种方法)

【问题讨论】:

  • 重命名为placeDetails.properties

标签: java spring message


【解决方案1】:

使用下方返回默认消息,以防您没有返回默认消息。您不必处理异常情况。

getMessage(String code, Object[] args, String defaultMessage, Locale locale)

【讨论】:

    【解决方案2】:

    有两种方法可以指定本地化消息的默认值。

    最好也提供一个placeDetails.properties,以防在placeDetails_locale.properties 中找不到给定的消息密钥。

    第二个(快速修复)是使用以下重载的getMessage() 方法

    String placeDetails = messageSource.getMessage(code, null,
                          "placeDetails", new Locale(locale.toLowerCase()));
    

    注意,如果键查找失败,第三个参数如何指定默认值。

    【讨论】:

    • 如果在placeDetails.properties 中找不到消息密钥会怎样?
    【解决方案3】:

    不幸的是,MessageSource 似乎没有 containsMessageKey(String) 方法或类似方法,此外,null 值作为 defaultMessage 被忽略 - 在这种情况下,messageKey 将被返回。

    我尝试使用以下方法解决该问题:

    @Service
    @Slf4j
    public class MessageService {
    
        @Autowired
        private MessageSource messageSource;
    
        private static final String messageKeyNotFound = "messageKey-not-found";
    
        public String getMessage(MessageKey messageKey, Locale locale) {
            String i18nMessage = messageSource.getMessage(messageKey.name(), null, messageKeyNotFound, locale);
            if (i18nMessage.equals(messageKeyNotFound)) {
                log.error("missing translation for messageKey '"+messageKey.name()+"' and locale '" + locale.getLanguage()+"'");
                return messageKey.name();
            }
            return i18nMessage;
        }
    
    }
    

    而 MessageKey 是一个包含有效键的 Enum。

    public enum MessageKey {
        title,
        name,
        age;
    }
    

    使用此解决方案,枚举和属性的 messageKeys 需要具有相同的名称

    title=Title
    name=Name
    age=Age
    

    您应该编写一个单元测试,它遍历所有可用的键和预期的语言环境以捕获任何拼写错误。但为了安全起见,如果出现意外的语言环境,您会收到错误日志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多