Заметив, что у Throwable есть метод getLocalizedMessage (), я решил использовать это в своем решении.
Мой класс BusinessException расширяет Exception, и его конструктор принимает ключ, представляющий ошибку:
public BusinessException(String key, Object[] arguments) {
this.key = key;
this.arguments = arguments;
this.locale = Locale.getDefault();
}
Как видите, языковой стандарт по умолчанию соответствует стандартному языку JVM. Однако в веб-приложении вместо этого следует использовать локаль текущего запроса. Таким образом, BusinessException предоставляет метод setLocale (), который должен быть вызван перед getLocalizedMessage (). Следовательно, в действии Struts2 идиома выглядит примерно так:
try {
// call business objects
}
catch(BusinessException be) {
be.setLocale(ActionContext.getContext().getLocale());
addActionError(be.getLocalizedMessage());
return ERROR;
}
Для записи, локализованные сообщения поступают из семейства комплектов ресурсов для класса исключения: BusinessException.properties и т. Д. Приложение Struts2 также имеет комплект ресурсов для всего приложения, но я решил не использовать его, чтобы избежать зависимостей бизнес-объектами в веб-фреймворке.