Spring启动内部化和异常

时间:2016-04-01 16:11:46

标签: spring exception-handling

我正在使用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并且它是脏的。

谢谢你们的时间。

1 个答案:

答案 0 :(得分:0)

对于那些对解决方案感兴趣的人,我使用全局变量来存储要使用的语言:public static Locale LANG = Locale.ENGLISH;并创建我自己的LocaleChangeInterceptor类,以使用请求中的给定语言设置LANG变量。