使用Spring 3实现国际化下降

时间:2012-01-13 20:18:05

标签: spring select internationalization

故事

我有一个表示用户访问级别的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"/>

问题

  1. 我想以这种方式在我的控制器中添加选项:optionList.add(new SelectOption(“userAccessLevelAdministratorLabel”,“ADMIN”));并让Spring将userAccessLevelAdministratorLabel转换为消息资源中的值。这可能吗?
  2. 如果Spring 3无法为我做到这一点,如果不在jsp中手动构建选项标签,怎么能实现呢?
  3. === 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'
    

2 个答案:

答案 0 :(得分:1)

当我需要在jsp之外的Controller中进行这样的操作时,我一直在制作我的Controllers MessageSourceAware。然后Spring会在交换时注入一个新的MessageSource,你可以像Spring那样查询它。在您的示例中,您将执行以下操作:

@Controller
public class someController implements MessageSourceAware {
    private MessageSource messageSource;

    @Override
    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    @RequestMapping
    // Pass in the locale from the LocaleResolver
    public void someMapping(Locale locale){
        optionList.add(new SelectOption(
           messageSource.getMessage("userAccessLevelAdministratorLabel", null, locale),
           "ADMIN"))
    }
}

答案 1 :(得分:1)

看一下spring roo项目。他们通过创建tagx标记来解决此类问题。这个标签执行你已经描述的标签(它包含一个litte逻辑来加载来自ressources的消息并构建选项标签)。但是因为逻辑只有一次,你可以在jspx文件中使用像普通标签这样的标签,感觉就像一个标签,可以做你想要的。