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



我有一个要求,所有布尔字段应保存在数据库中的"Y"one_answers"F"值。在我的形式中,我使用质面<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。我做错了什么?

我开始写评论,但意识到我的观点可以写成一个完整的回答。首先,对纯值集使用String值是没有意义的。这就是枚举类型的作用。JSF 2和大多数流行的orm(如Hibernate)都支持它们,所以对于您的情况,理想的情况是这样的:

public enum Option {
    Y, N;
}

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

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

相关内容

  • 没有找到相关文章

最新更新