在 SpringMVC getMessage 来自控制器外部函数中的 i18n 属性

in SpringMVC getMessage from i18n properties in a function outside the controller

我想从函数中的 i18n 属性中检索消息。我可以通过以下语句在我的服务层或控制器中检索消息:

@Autowired
private ApplicationContext appContext;


public void myFunction(){
String errrorMsg = appContext.getMessage("application.errorcode.sessionExpiry", null, LocaleContextHolder.getLocale());
}

但我想在服务层或控制器之外的函数中检索此 i18n 消息。这个函数是从我的服务层调用的。 我该怎么做? 我试图在外部 class 中复制相同的代码,但我得到了 nullPointerException

MessageSource 注入您的服务(而不是 ApplicationContext)。

在该服务中,您可以使用 messageSource..getMessage("application.errorcode.sessionExpiry", null, LocaleContextHolder.getLocale());

如果您需要此服务之外的此功能(在某些 Not-Spring-Bean 实例中),那么我会将 MessageSource(和语言环境)传递给另一个 class.

@Component
public class MessageSourceExternalizer {

    @Autowired
    private MessageSource messageSource;

    public String getMessage(String code) {
        //Attention LocaleContextHolder.getLocale() is thread based,
        //maybe you need some fallback locale
        return messageSource.getMessage(code, new Object[0], LocaleContextHolder.getLocale());
    } }

@Service
public YourService {

    @Autowired
    private MessageSourceExternalizer messageSourceExternalizer;

    public void yourServiceMethod() {
        ....
        YourNotSpringBean yourNotSpringBean 
             = new YourNotSpringBean(messageSourceExternalizer);
        yourNotSpringBean.doSomething(...);
    } }


public class YourNotSpringBean {

    private final MessageSourceExternalizer messageSourceExternalizer;
    public YourNotSpringBean(MessageSourceExternalizer messageSourceExternalizer) {
         this.messageSourceExternalizer = messageSourceExternalizer;
    }

    public void doSomething() {
        ....
        this.messageSourceExternalizer.getMessage("application.errorcode.sessionExpiry");
    }

}