使用Converter for type Boolean时,Spring复选框JSP标记被破坏

时间:2011-07-04 19:51:50

标签: java spring spring-mvc spring-roo

我已经使用Spring Roo和Spring MVC设置了一个CRUD Web应用程序。我的问题是:因为我使用转换器来本地化显示布尔值,所以Spring JSP Tag 复选框被破坏,这意味着复选框不会从支持bean中获取实际值。他们总是虚假和不受控制。

我做了一些研究,可能在 org.springframework.web.servlet.tags.form.CheckboxTag writeTagDetails 方法中发现了错误。以下是此方法的有趣部分:

// the concrete type may not be a Boolean - can be String
if (boundValue instanceof String) {
    boundValue = Boolean.valueOf((String) boundValue);
}
Boolean booleanValue = (boundValue != null ? (Boolean) boundValue : Boolean.FALSE);
renderFromBoolean(booleanValue, tagWriter);

因为我使用转换器显示yes / no而不是true / false,所以 boundValue 是一个String,并且 Boolean.valueOf 的调用总是导致false因为 valueOf 方法不知道使用的Spring Converter并将yes / no解释为false。

如何使用Spring解决此问题?有人有线索吗?我的大脑已经到了一条死胡同。

为了完整性:布尔类型的转换器按预期工作(代码见下文)。

public class BooleanConverter implements Converter<Boolean,String>, Formatter<Boolean> {

@Autowired
private MessageSource messageSource;

@Override
public String print(Boolean object, Locale locale) {
    return (object)
            ? messageSource.getMessage("label_true", null, LocaleContextHolder.getLocale())
            : messageSource.getMessage("label_false", null, LocaleContextHolder.getLocale());
}

@Override
public String convert(Boolean source) {
    return this.print(source, null);
}
}

2 个答案:

答案 0 :(得分:1)

您可能应该编写自己的名为Choice的类型,其Choice.YESChoice.NO作为序数枚举,根据存储在数据库中的值对应于1或0。

然后,您可以在此类型的应用程序中定义自己的显示标签和输入标签,以解决此问题。

答案 1 :(得分:1)

添加到上一个答案,从3.2版开始,您可以为所有控制器和所有布尔字段注册属性编辑器,如下所示:

package your.package.path;

import org.springframework.beans.propertyeditors.CustomBooleanEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.WebRequest;

@ControllerAdvice
public class GlobalBindingInitializer {

    @InitBinder
    public void registerCustomEditors(WebDataBinder binder, WebRequest request) {
        binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(false));
    }
}

如果您来自Spring Roo基本配置,请记住在webmvc-config.xml中添加此行

    <context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/>
像这样:

<context:component-scan base-package="your.package.path" use-default-filters="false">
    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
    <context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/>
</context:component-scan>