Я полагаю, вы смешали две концепции:
- файлы свойств
- пакеты ресурсов сообщений
Файлы свойств содержат свойства (не зависят от локали),В Spring они могут быть загружены, например, через util:properties
и могут использоваться в аннотациях @Value
.
Но пакеты ресурсов сообщений (которые основаны на файлах, которые выглядят как файлы свойств) зависят от языка.Весной вы можете загрузить их через org.springframework.context.support.ResourceBundleMessageSource
.Но не вводить в строку через @Value
.Вы не можете внедрить их, потому что @Value
инъекция выполняется один раз для одного компонента, @Value
будет оцениваться один раз (чаще всего во время запуска), и вычисленное значение будет введено.Но это не то, что вам обычно нужно, когда вы используете пакеты ресурсов сообщений.Потому что тогда вам нужно оценивать значение каждый раз, когда используется переменная, в зависимости от языка пользователя.
Но вы можете легко создать его самостоятельно!
ЕдинственноеВам нужен этот класс:
import java.util.Locale;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
@Configurable
public class MSG {
private String key;
@Resource(name = "messageSource")
private MessageSource messageSource;
public MSG(String key) {
super();
this.key = key;
}
public String value() {
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(key, new Object[0], locale);
}
@Override
public String toString() {
return value();
}
}
Затем вы можете использовать его следующим образом:
@Service
public class Demo {
@Value("demo.output.hallo")
private MSG hallo;
@Value("demo.output.world")
private MSG world;
public void demo(){
System.out.println("demo: " + hello + " " + world);
}
}
Чтобы запустить его, вам нужно включить <context:spring-configured />
, чтобы включить AspectJПоддержка @Configurable, и (это важно) вам нужно создать экземпляр сообщения Ressouce Bundle в том же контексте приложения (например, в веб-приложениях вы в большинстве случаев определяете определение ReloadableResourceBundleMessageSource
в контексте веб-приложения, но это не такработать в этом случае, потому что объект MSG находится в «нормальном» контексте приложения.