我正在使用Spring启动API并尝试使其适合多种语言,为此我使用此代码:
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.ENGLISH);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
String[] baseNames = { "messages/messages", "messages/messages_errors" };
source.setBasenames(baseNames);
source.setDefaultEncoding(StandardCharsets.UTF_8.toString());
return source;
}
所以逻辑上在我的控制器中我得到lang参数来知道用户选择了哪种语言并且效果很好。 问题是我从控制器调用的方法中抛出一个异常,这里是代码:
public User getUser(final Long pIdUser) throws EntityNotFound {
User vUser = userRepository.findOne(pIdUser);
if (vUser == null) {
throw new EntityNotFound("entity.notFound.byId", new Object[] { pIdUser });
}
return vUser;
}
我正在使用@ControllerAdvice获取异常并将异常消息切换为正确的语言:
@ControllerAdvice
public class GlobalExceptionHandler {
@Autowired
private MessageSource messageSource;
@ExceptionHandler(value = EntityNotFound.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
protected EntityNotFound EntityNotFound(EntityNotFound pException, Locale lang) {
return new EntityNotFound(messageSource.getMessage(pException.getMessage(), pException.getArgs(), lang));
}
但是我没有正确的信息,我有" entity.notFound.byId"在控制器的响应中。有人知道如何处理国际化和错误吗?
我认为如果我将lang变量设置为globale,我可以在第一次调用EntityNotFound异常时获得正确的消息,但是我必须在每个控制器中设置lang并且它是脏的。
谢谢你们的时间。
答案 0 :(得分:0)
对于那些对解决方案感兴趣的人,我使用全局变量来存储要使用的语言:public static Locale LANG = Locale.ENGLISH;
并创建我自己的LocaleChangeInterceptor类,以使用请求中的给定语言设置LANG变量。