布尔到JSF中的自定义字符串转换器

时间:2014-03-15 12:00:46

标签: java jsf jsf-2 primefaces converter

我要求所有布尔字段都应该保存在数据库中作为&#34; Y&#34;和&#34; F&#34;值。在我的表单中,我使用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。我在做什么呢?

1 个答案:

答案 0 :(得分:1)

我开始写评论,但意识到我的意见可以写成一个完整的答案。首先,在你正在做的时候使用String值作为纯值集合是没有意义的。这就是enum types的用途。 JSF 2和最受欢迎的ORM都支持Hibernate,所以对于你的情况,理想的事情就是这样:

public enum Option {
    Y, N;
}

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

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

相关问题