Spring Boot 2中如何将messages.properties键传入控制器抛出的异常?
在Spring Boot 2中为控制器异常实现多语言消息
你遇到的问题很典型——直接抛出带占位符的字符串时,Spring不会自动帮你解析成对应的多语言消息,得主动借助MessageSource来完成这件事。下面是几种简单直接的实现方式:
方式一:在控制器中直接使用MessageSource解析消息
首先确保你已经在控制器中注入了配置好的MessageSource:
@Autowired private MessageSource messageSource;
然后在需要抛出异常的地方,先通过MessageSource获取对应语言的消息,再抛出异常:
// 获取当前请求的Locale,Spring会自动匹配对应的messages_xx.properties文件 Locale currentLocale = LocaleContextHolder.getLocale(); // 解析消息键,如果消息有参数(比如{0}这类占位符),可以传入参数数组作为第二个参数 String errorMsg = messageSource.getMessage("user.balance.insufficientBalance", null, currentLocale); throw new InsufficientBalanceException(errorMsg);
方式二:用全局异常处理器统一解析(更优雅)
如果多个地方都要抛这类异常,每次都写解析逻辑太繁琐,可以用@ControllerAdvice做全局异常处理:
1. 改造你的异常类
让它存储消息键和参数,而不是直接存字符串:
public class InsufficientBalanceException extends RuntimeException { private final String messageKey; private final Object[] args; public InsufficientBalanceException(String messageKey, Object... args) { this.messageKey = messageKey; this.args = args; } // 提供getter方法给全局处理器调用 public String getMessageKey() { return messageKey; } public Object[] getArgs() { return args; } }
2. 编写全局异常处理器
@ControllerAdvice public class GlobalExceptionHandler { @Autowired private MessageSource messageSource; @ExceptionHandler(InsufficientBalanceException.class) public ResponseEntity<String> handleInsufficientBalance(InsufficientBalanceException ex, Locale locale) { // 自动根据请求Locale解析消息 String localizedMsg = messageSource.getMessage(ex.getMessageKey(), ex.getArgs(), locale); return ResponseEntity.badRequest().body(localizedMsg); } }
3. 抛出异常时只需传消息键
// 直接传消息键,参数可选(如果消息里有占位符的话) throw new InsufficientBalanceException("user.balance.insufficientBalance");
小提示:优化你的MessageSource配置
你当前的messageSource配置里setBasename("classpath:messages_br")是固定加载葡萄牙语的配置文件,如果要支持多语言切换,建议改成:
@Bean public MessageSource messageSource() { ReloadableResourceBundleMessageSource bundleMessageSource = new ReloadableResourceBundleMessageSource(); bundleMessageSource.setBasename("classpath:messages"); // 去掉后缀_br bundleMessageSource.setDefaultEncoding("UTF-8"); bundleMessageSource.setDefaultLocale(new Locale("pt", "BR")); // 设置默认语言为葡萄牙语巴西 return bundleMessageSource; }
这样Spring会根据请求头的Accept-Language自动匹配对应的messages_xx.properties文件(比如messages_en.properties对应英语,messages_br.properties对应葡萄牙语),没有匹配的话就用默认的pt-BR。
内容的提问来源于stack exchange,提问作者user4383363
相关产品推荐
相关产品推荐

