Это похоже на хак, но вы можете написать собственную реализацию java.util.Map
, которая при вызове get(key)
получает сообщение из Spring MessageSource
.Это Map
может быть добавлено в модель с помощью клавиши msg
, что позволяет вам разыменовывать сообщения с помощью ${msg.myKey}
.
Возможно, существует какая-то другая динамическая структура, которая не распознается JSP EL, но неa Map
, но я не могу вспомнить ни одного лишнего.
public class I18nShorthandInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = Logger.getLogger(I18nShorthandInterceptor.class);
@Autowired
private MessageSource messageSource;
@Autowired
private LocaleResolver localeResolver;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("msg", new DelegationMap(localeResolver.resolveLocale(request)));
return true;
}
private class DelegationMap extends AbstractMap<String, String> {
private final Locale locale;
public DelegationMap(Locale locale) {
this.locale = locale;
}
@Override
public String get(Object key) {
try {
return messageSource.getMessage((String) key, null, locale);
} catch (NoSuchMessageException ex) {
logger.warn(ex.getMessage());
return (String) key;
}
}
@Override
public Set<Map.Entry<String, String>> entrySet() {
// no need to implement this
return null;
}
}
}
В качестве альтернативы:
<fmt:message key="key.name" var="var" />
Затем используйте ${var}
как обычный EL.