Icefaces 2 бета 1: привязка selectmanycheckbox к карте вызывает ошибку преобразования - PullRequest
1 голос
/ 26 июля 2010

, если я хочу связать атрибут-значение h:selectmanycheckbox с картой, с ri из jsf 2.0.3 я бы сделал что-то вроде следующего

боб:

private Map<String, String[]> values = new HashMap<String, String[]>();

public Map<String, String[]> getValues() {
    return values;
}

public void setValues(Map<String, String[]> values) {
    this.values = values;
}

и страница xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Facelet Title</title>
</h:head>
<h:body>

    <h:form>
        <h:selectManyCheckbox
            id="test"
            value="#{testController.values['foo']}">
                <f:selectItem itemLabel="1" itemValue="1_1" />
                <f:selectItem itemLabel="2" itemValue="1_2" />
                <f:selectItem itemLabel="3" itemValue="1_3" />
                <f:selectItem itemLabel="4" itemValue="1_4" />                    
        </h:selectManyCheckbox>           
        <h:commandButton value="Send" />

    </h:form>

</h:body>

Это работает нормально, но в моем приложении мне нужно больше контроля над местоположением каждого флажка, поэтому я заменил стандартные теги <h:selectManyCheckbox> их эквивалентами icefaces <ice:selectManyCheckbox> и <ice:checkbox>.
Бин остается прежним, и xhtml-страница теперь выглядит так:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ice="http://www.icesoft.com/icefaces/component"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Facelet Title</title>
</h:head>
<h:body>
    <h:form>
        <ice:selectManyCheckbox
            id="test"
            layout="spread"
            value="#{testController.values['foo']}">
                <f:selectItem itemLabel="1" itemValue="1_1" />
                <f:selectItem itemLabel="2" itemValue="1_2" />
                <f:selectItem itemLabel="3" itemValue="1_3" />
                <f:selectItem itemLabel="4" itemValue="1_4" />                    
        </ice:selectManyCheckbox>           
        <table border="1">
            <tr>
                <td><ice:checkbox id="c1" for="test" index="0" /></td>
                <td><ice:checkbox id="c2" for="test" index="1" /></td>
            </tr>
            <tr>
                <td><ice:checkbox id="c3" for="test" index="2" /></td>
                <td><ice:checkbox id="c4" for="test" index="3" /></td>
            </tr>
        </table>
        <h:commandButton value="Senden" />            
    </h:form>

</h:body>

Теперь, когда я отправляю форму, я получаю ошибку преобразования и не могу понять, почему.

Если я связываю атрибут-значения <ice:selectManyCheckbox> с простым строковым массивом, он отлично разветвляется, но, поскольку я не знаю, сколько будет групп флажков, он мне понадобится для работы с картой.

Я использую Icefaces 2.0.0 beta 1 вместе с Sun RI 2.0.3 и EL 2.2 на Tomcat 6.0.26.

Кто-нибудь знает решение моей проблемы?

Ответы [ 3 ]

2 голосов
/ 05 октября 2013

Некоторое время назад Ifaced точно такая же проблема, и я понял, что это странное поведение, когда вы устанавливаете в качестве значения Map в selectManyCheckbox, так что я вместо того, чтобы использовать Map<Integer,List<SomeValues>> это было Map<Integer,SomeValuesContainer> и внутри этого класса я устанавливаю List<SomeValues> как свойство:

class SomeValuesContainer implement Serializable{
    List<SomeValues> someValuesList;
    SomeValues getSomeValueList(){
         return someValuesList;
    }

    void setSomeValuesList(List<SomeValues> someValueList){
          this.someValuesList = someValuesList;
    }
}

Таким образом, я могу получить доступ из вида следующим образом:

<ice:selectManyCheckbox
        id="test"
        layout="spread"
        value="#{testController.values['foo'].someValuesList}">

Это происходит потому, что значение selectManyCheckbox должно видеть значение как свойство, а не как функцию.

0 голосов
/ 27 июля 2010

Вы можете попытаться поставить столько фиктивных маплетов, сколько вам нужно, чтобы "инициализировать" вашу карту.

0 голосов
/ 26 июля 2010

Вы пытались реализовать конвертер?

...