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

Fel*_*lix 5 java spring spring-mvc spring-roo

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

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

// 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);
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能用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);
}
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*les 3

这似乎是可以克服的。也就是说,您希望人类可读的格式化程序向用户显示模型中布尔值的是/否。但是您仍然希望复选框 HTML 元素正常工作,并且似乎这些 HTML 复选框元素/小部件/JSP 标记期望使用 true/false 字符串(或布尔 Java 类型),它似乎没有使用转换器来获取任意值yes/no 字符串返回布尔类型。

对我来说,这个问题表现为当模型设置了 Boolean.TRUE 值时,复选框的初始状态永远不会被选中。这意味着记录的任何读取-修改-更新(如果不编辑该字段,当用户未更改该字段时,最终会从“true”转换为“false”)。这是因为即使模型处于真实状态,UI 中的初始状态也与模型不一致(它始终显示未选中的状态,即错误状态)。即使模型的该值具有 Boolean.TRUE,显示的值也是 HTML 编辑记录屏幕中未选中的复选框。这是因为 HTML 复选框元素不会将“yes”解释为“true”,并且它默认为 false(因为这是默认的布尔值)。

因此,定义您的格式化程序/转换器(就像您已经在做的那样)。但在你的 @Controller 添加:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Boolean.class, "friesWithThat", new CustomBooleanEditor(false));
}
Run Code Online (Sandbox Code Playgroud)

这似乎使字符串显示值继续为 yes/no,但使用并传递给复选框 HTML 元素的值仍然为 true/false。

现在,当编辑/更新记录(在 CRUD 中)时,复选框的初始状态与模型一致,并且保存数据(不编辑任何字段)不会转换复选框状态(这是我对您遇到的问题的理解)。

因此,从这里我认为我们可以理解转换器/格式化程序用于数据的一般显示,而属性编辑器用于映射模型数据,以便 UI 小部件所需的数据。