Преобразовать значение h: selectBooleanCheckbox между логическим значением и строкой - PullRequest
2 голосов
/ 15 июня 2011

У меня есть компонент поддержки, содержащий поле creditCard, которое может иметь два строковых значения y или n, заполненных из БД.Я хотел бы отобразить это в флажке, чтобы y и n были преобразованы в boolean.

Как я могу это реализовать?Я не могу использовать пользовательский конвертер, так как getAsString() возвращает String при рендеринге ответа, тогда как мне нужен boolean.

Ответы [ 3 ]

19 голосов
/ 15 июня 2011

Компонент <h:selectBooleanCheckbox> не поддерживает пользовательский конвертер.Свойство должно быть boolean.Period.

Лучшее, что вы можете сделать, - это выполнить преобразование в слое постоянства или добавить дополнительный логический метод получения / установки, который украшает исходный y / n метод получения / установки или просто заменить старыйполучатель / установщик в целом.Например,

private String useCreditcard; // I'd rather use a char, but ala.

public boolean isUseCreditcard() {
    return "y".equals(useCreditcard);
}

public void setUseCreditcard(boolean useCreditcard) {
    this.useCreditcard = useCreditcard ? "y" : "n";
}

, а затем использовать его в <h:selectBooleanCheckbox>.

<h:selectBooleanCheckbox value="#{bean.useCreditcard}" />
0 голосов
/ 26 августа 2016

Вы можете использовать BooleanConverter для java-примитивов, он анализирует логический текст в вашем управляемом бое, на здесь просто вставьте ваш код, подобный этому, в ваш файл .xhtml

<p:selectOneMenu id="id"
                        value="#{yourMB.booleanproperty}"
                        style="width:60px" converter="javax.faces.Boolean">
                        <p:ajax listener="#{yourMB.anylistener}"
                            update="anyIDcontrol" />
                        <f:selectItem itemLabel="------" itemValue="#{null}"
                            noSelectionOption="true" />
                        <f:selectItem itemLabel="y" itemValue="true" />
                        <f:selectItem itemLabel="n" itemValue="false" />                                                
                    </p:selectOneMenu>

ManagedBean:

@ManagedBean(name="yourMB")
@ViewScoped
public class YourMB implements Serializable {

       private boolean booleanproperty;


    public boolean isBooleanproperty() {
        return booleanproperty;
    }
    public void setBooleanproperty(boolean booleanproperty) {
        this.booleanproperty = booleanproperty;
    }      

}    
0 голосов
/ 14 октября 2014

У меня была похожая проблема, и я согласен с предыдущим постом, вы должны решить эту проблему на постоянном уровне.Однако есть и другие решения.Моя проблема была следующей: у меня есть столбец TINYINT в базе данных, который представлял логическое значение true или false (0 = false, 1 = true).Итак, я хотел отобразить их и обработать как логическое значение в моем приложении JSF.К сожалению, это было не совсем возможно, или просто я не нашел правильного пути.Но вместо того, чтобы использовать флажок, я решил использовать selectOneMeny и преобразовать эти значения в «Да» или «Нет».Вот код, так что кто-то с подобной проблемой может использовать его.

Конвертер:

@FacesConverter("booleanConverter")

public class BooleanConverter implements Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {

    short number= 0;

    try {
        if (value.equals("Yes")) {
            number= 1;
        }
    } catch (Exception ex) {
        FacesMessage message = new FacesMessage();
        message.setSeverity(FacesMessage.SEVERITY_FATAL);
        message.setSummary(MessageSelector.getMessage("error"));
        message.setDetail(MessageSelector.getMessage("conversion_failed") + ex.getMessage());
        throw new ConverterException(message);
    }
    return number;
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {


    return value.toString();
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

JSF Страница:

<h:selectOneMenu id="selectOnePlayerSucc" value="#{vezbaTrening.izvedenaUspesno}" converter="booleanConverter">
  <f:selectItems id="itemsPlayerSucc" value="#{trainingOverview.bool}" var="opt" itemValue="#{opt}" itemLabel="#{opt}"></f:selectItems>

в моем ManagedBean я создал список с возможными значениями («Да» и «Нет»)

private List<String> bool;

public List<String> getBool() {
    return bool;
}

public void setBool(List<String> bool) {
    this.bool = bool;

@PostConstruct
public void init () {
    ...

    bool = new LinkedList<>();
    bool.add("Yes");
    bool.add("No");
}

enter image description here

...