Bonjour,

Je dois avouer que je suis un peu bloqué sur un problème de validation, et je ne comprends pas pourquoi...

Dans un formulaire (h:form), j'ai une combobox qui me permet de choisir un profile. Voici son code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<h:selectOneMenu value="#{pmb.profileId}">
    <f:selectItems value="#{pmb.profileList}" />
    <a4j:support event="onchange" reRender="permissions" actionListener="#{pmb.handleProfileSelection}" />
</h:selectOneMenu>
La méthode handleProfileSelection du bean pmb est la suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
public void handleProfileSelection(ActionEvent actionEvent) {
    List<Permission> permissionList = habilitationService.findPermissionsByProfileId(getProfileId());
    assignedPermissions = new ArrayList<MySelectItem>();
    if (!permissionList.isEmpty()) {
        for (Permission p : permissionList) {
            assignedPermissions.add(new MySelectItem(new Integer(p.getPermissionId()), p.getPermissionLabel()));
        }
    }
}
Rien de méchant, elle met à jour une liste contenant des éléments MySelectItem, une classe qui étend SelectItem en redéfinissant equals et hashCode (à cause de ça).

Mon listShuttle se définit comme ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<a4j:outputPanel id="permissions">
    <rich:listShuttle fastOrderControlsVisible="false" id="permissionId"
        converter="selectItemListShuttleConverter"
        copyAllControlLabel="Add all" copyControlLabel="Add"
        removeAllControlLabel="Remove all" removeControlLabel="Remove"
        orderControlsVisible="false" var="item"
        sourceCaptionLabel="Available permissions"
        targetCaptionLabel="Assigned permissions"
        sourceValue="#{pmb.selectedPermissions}"
        targetValue="#{pmb.assignedPermissions}">
        <rich:column>
            <h:outputText value="#{item.label}"/>
        </rich:column>
    </rich:listShuttle>
</a4j:outputPanel>
Le problème c'est que quand je choisis une valeur dans mon combobox, tout se passe bien, et le listShuttle s'affiche bien. Mais si je change à nouveau une valeur dans le combobox, j'ai une erreur de validation, à savoir :

profileForm:permissionId: Validation Error: Value my.package.MySelectItem@xxxx is not valid
Pour information le code du converter :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
public Object getAsObject(FacesContext fc, UIComponent compo, String val) {
    String[] str = val.split(":");
    return new MySelectItem(str[0], str[1]);
}
 
public String getAsString(FacesContext fc, UIComponent compo, Object val) {
    MySelectItem data = (MySelectItem) val;
    return data.getValue() + ":" + data.getLabel();
}
Franchement, je ne comprends pas d'où vient l'erreur...
Une idée ?

ps: La version de RichFaces utilisée est la 3.1.4.GA