【问题标题】:Boolean to custom string converter in JSFJSF 中的布尔到自定义字符串转换器
【发布时间】:2014-04-20 20:06:00
【问题描述】:

我要求所有布尔字段都应作为“Y”和“F”值保存在数据库中。在我的表单中,我使用 primefaces <p:selectBooleanCheckbox> 来检索布尔输入:

<h:outputLabel for="termsOfUseAck" value="#{msg['user_sign_up.terms_of_use_ack']}" />
<p:selectBooleanCheckbox id="termsOfUseAck" value="#{accountRegistrationController.account.termsOfUseAck}" converter="booleanToYNConverter" />

而我的转换器定义如下:

@FacesConverter(value="booleanToYNConverter")
public class BooleanToYNConverter implements Converter {
    public BooleanToYNConverter() {
    }

    public Object getAsObject(FacesContext facesContext,
                              UIComponent uiComponent,
                              String param) {
        try {
            Boolean result = Boolean.parseBoolean(param);
            System.out.println("#BooleanToYNConverter.getAsObject param is: " + param);
            return result;
        } catch (Exception exception) {
            throw new ConverterException(exception);
        }
    }

    public String getAsString(FacesContext facesContext,
                              UIComponent uiComponent,
                              Object obj) {
        try {
            if ((obj != null) && ((Boolean) obj)) {
                System.out.println("#BooleanToYNConverter.getAsString returns Y");
                return "Y";
            } else {
                System.out.println("#BooleanToYNConverter.getAsString returns N");
                return "N";
            }
        } catch (Exception exception) {
            throw new ConverterException(exception);
        }
    }
}

在控制台中我可以看到转换器被调用并返回单个字符:

#BooleanToYNConverter.getAsString returns Y

但不幸的是,最终accountRegistrationController.account.termsOfUseAck 设置为truefalse 值,而不是所需的YN。我在做什么?

【问题讨论】:

  • 感谢您的评论。请问在getter和setter上使用包装器是否是我唯一的选择?这是我的第一个想法,但我认为转换器更优雅且易于维护。
  • 最简单的方法是设置 Y 或 N 基于 true false 通过执行 entity.setColumn(termsOfUseAck?"Y":"N")。

标签: java jsf jsf-2 primefaces converter


【解决方案1】:

我开始写评论,但意识到我的意见可以写成一个完整的答案。首先,将String 值用于纯值集是没有意义的。这就是enum types 的用途。 JSF 2 和作为 Hibernate 的最流行的 ORM 都支持它们,因此对于您的情况,理想的情况是这样的:

public enum Option {
    Y, N;
}

好吧,话虽如此,将布尔值存储在集合中没有任何意义,因此您需要更深入地分析您的模型。

如果一个属性只有两种可能性,则使用布尔值,因为它通常在 DB 层中占用一个位。相反,如果它是一整套可能性(未来也可能会增加),那么请在您的控制代码和数据库中使用enum,或者在您用于持久性的任何内容中使用。

【讨论】:

  • 一些 DBMS,如 MySQL/MariaDB 连接器,会将其持久化为 tinyint(1)1 表示 true0 表示 false。这意味着提问者应该真正重新分析他的数据模型。常见的是:private Boolean someFlag; 带有 getter/setter 然后在应用层表示为 YesNo
猜你喜欢
  • 2014-03-14
  • 2015-11-30
  • 2014-09-21
  • 2013-03-23
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2018-09-07
相关资源
最近更新 更多