java - 将 Converter 用于 Boolean 类型时,Spring 复选框 JSP 标记被破坏

标签 java spring spring-mvc spring-roo

我已经使用 Spring Roo 和 Spring MVC 设置了一个 CRUD Web 应用程序。我的问题是:因为我正在使用转换器来本地化 boolean 值的显示,所以 Spring JSP 标记 checkbox 被破坏,这意味着复选框不会从支持 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);

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

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

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

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);
}
}

最佳答案

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

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

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

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

这似乎使字符串显示值继续为是/否,但使用并传递给复选框 HTML 元素的值继续为真/假。

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

从这里我认为我们可以理解 Converters/Formatters 用于数据的一般显示,而 PropertyEditors 用于映射模型数据,因此 UI 小部件所需的数据。

关于java - 将 Converter 用于 Boolean 类型时,Spring 复选框 JSP 标记被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6575542/

相关文章:

java - Spring 安全 405

java - spring mvc hibernate 锁定表的行

java - 如何创建一个公式从另一个公式中的值中查找 D 的值

Java 小程序与 IE8 安全功能的兼容性

java - 在这种情况下使用 Springs IoC?

java - 在 Eclipse 中的包资源管理器中自定义 TreeView 项目

java - TDLib - 通过他的电话号码向其他人发送消息

java - WebDataBinder 自定义日期编辑器不起作用

Spring boot + flyway + H2 in memory :Caused by: org. h2.jdbc.JdbcSQLException: Table "xxxx"not found; SQL语句:

java - spring web mvc中的组合框