История
У меня есть элемент управления select, который представляет уровень доступа пользователя. Я ищу способ интернационализировать это. Метка должна быть загружена из ресурса сообщения, а значение должно использоваться как есть. Я готовлю все свои выпадающие списки в контроллерах, используя простой класс SelectOption, который имеет метку и свойства значения. Таким образом, мой выбор будет выглядеть одинаково во всех jsp.
Задача
Я нашел несколько примеров, но они основаны на логике в jsp. Разработчик просматривает свои метки и вручную создает тег опции, используя ресурс сообщения. Хотя это работает, просто должен быть лучший способ. Я также нашел некоторые комментарии о том, что Spring 3 будет поддерживать интернационализацию опционных ярлыков, но я не могу найти ничего конкретного по этому поводу.
Логика контроллера
Collection<SelectOption> optionList = new ArrayList<SelectOption>();
optionList.add(new SelectOption("-SELECT-", "-"));
optionList.add(new SelectOption("Administrator", "ADMIN"));
optionList.add(new SelectOption("Editor", "EDIT"));
bean.setFilterUserAccessLevelOptionList(optionList);
логика JSP
<form:select path="filterUserAccessLevel" items="${bean.filterUserAccessLevelOptionList}" itemLabel="label" itemValue="value"/>
Вопросы
- Я бы хотел добавить опции в свой контроллер следующим образом: optionList.add (new SelectOption ("userAccessLevelAdministratorLabel", "ADMIN")); и Spring преобразует userAccessLevelAdministratorLabel в значение из ресурса сообщения. Это возможно?
- Если Spring 3 не может сделать это для меня, как еще это можно сделать без ручного создания тега option в jsp?
=== 2012-01-15 ==================================== ==========================
Все еще пытаюсь найти решение, используя идею Авейгольда.
Контроллер
@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
SelectOptionListBuilder listBuilder;
@RequestMapping("/userIndex/{pageNumber}")
public ModelAndView getUserList(@PathVariable Integer pageNumber, @ModelAttribute("userIndexBean") UserIndexBean phantomBean, Locale locale, Model model) {
UserIndexBean bean = new UserIndexBean();
// prepare filter form
Collection<SelectOption> optionList = listBuilder.getUserAccessLevelOptionList(true, SortOrder.NONE, locale);
bean.setFilterUserAccessLevelOptionList(optionList);
SelectOptionListBuilderImpl
@Component
public class SelectOptionListBuilderImpl implements SelectOptionListBuilder, MessageSourceAware {
private MessageSource messageSource;
@Override
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
@Override
public List<SelectOption> getUserAccessLevelOptionList(boolean addSelectPrompt, SortOrder sortOrder, Locale locale) {
List<SelectOption> optionList = new ArrayList<SelectOption>();
if(addSelectPrompt) {
optionList.add(new SelectOption(messageSource.getMessage("common.selectPromptLabel", null, locale), "-"));
}
messageSource mapping
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/i18n/messages" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="UseCodeAsDefaultMessage" value="true"/>
</bean>
Исключение
org.springframework.context.NoSuchMessageException: No message found under code 'common.selectPromptLabel' for locale 'en_CA'