我已经使用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);
}
}
答案 0 :(得分:1)
您可能应该编写自己的名为Choice
的类型,其Choice.YES
和Choice.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>