2009-07-08 4 views
1

J'ai rencontré un problème avec ce problème depuis un certain temps et aucune recherche ou lecture n'a abouti à une réponse. J'ai posté sur les forums de printemps, mais en vain. Peut-être que quelqu'un ici peut aider?Formulaire liant un HashMap à l'aide d'un contrôleur basé sur des annotations dans Spring 2.5

J'ai un haricot contenant un HashMap que j'ai formé à l'aide de Spring: form taglib et Spring: bind. La liaison à la vue fonctionne parfaitement, mais lors de la soumission du formulaire et de la manipulation avec un contrôleur basé sur des annotations, la liaison ne semble pas fonctionner correctement. Je ne reçois aucune exception, mais le HashMap n'est pas peuplé. Voici ma configuration:

Le JSP:

<form:form method="post" action="updateUserPermissions" modelAttribute="wsPermissions" > 
    <table> 
     <tr class="head"> 
      <td>Workspace</td> 
      <td>Read?</td> 
      <td>Write?</td> 
      <td>Manage?</td> 
     </tr> 
     <c:forEach var="ws" varStatus="wsItem" items="${selectedUserWSs}"> 
      <c:set var="wsURI" value="'${ws.uri}'"/> 
      <tr> 
       <td>${ws.kbInfo.name} @ ${ws.community.name}</td> 
       <td> 
        <spring:bind path="wsPermissions.map[${ws.uri}].read"> 
         <input type="checkbox" <c:if test="${status.value}">checked</c:if> disabled="disabled"/> 
        </spring:bind> 
       </td> 
       <td> 
        <spring:bind path="wsPermissions.map[${ws.uri}].write"> 
         <input type="checkbox" <c:if test="${status.value}">checked</c:if>/> 
        </spring:bind> 
       </td> 
       <td> 
        <spring:bind path="wsPermissions.map[${ws.uri}].manage"> 
         <input type="checkbox" <c:if test="${status.value}">checked</c:if>/> 
        </spring:bind> 
       </td> 
       <td><a href="removeUserWorkspace?userid=${selectedUser.email}&wsid=${ws.uri}">[Remove]</a></td> 
      </tr> 
     </c:forEach> 
    </table> 
    <input type="hidden" name="userid" value="${selectedUser.email}" /> 
    <input type="submit" value="Update user permissions" /> 
</form:form> 

Cette affiche bien, Travaux de reliure, les cases montrent les valeurs initiales correctes. La soumission de formulaire est ensuite traitée par cette méthode de contrôleur:

@RequestMapping 
public String updateUserPermissions(@ModelAttribute(value="wsPermissions") WorkspacePermissionMap wsPermissions, 
     @RequestParam String userid, 
     HttpServletRequest request, ModelMap modelMap){ 
    // code to update permissions here..... 
    LOG.debug(wsPermissions.getMap().size()); 
    //the above prints zero 
    return "redirect:editUser?id="+userid; 
} 

La mise au point de la méthode du contrôleur indique que HashMap est vide.

Voici le code pour WorkspacePermissionMap:

public class WorkspacePermissionMap { 

private Map<String, WorkspacePermission> map = new HashMap<String, WorkspacePermission>(); 

/** 
* @param map the map to set 
*/ 
public void setMap(Map<String, WorkspacePermission> map) { 
    this.map = map; 
} 

/** 
* @return the map 
*/ 
public Map<String, WorkspacePermission> getMap() { 
    return map; 
} 

}

et WorkspacePermission:

public class WorkspacePermission { 
private boolean read = false; 
private boolean write = false; 
private boolean manage = false; 


/** 
* @return the write 
*/ 
public boolean isWrite() { 
    return write; 
} 
/** 
* @param write the write to set 
*/ 
public void setWrite(boolean write) { 
    this.write = write; 
    if (write){ 
     setRead(write); 
    } else { 
     setManage(write); 
    } 
} 
/** 
* @return the moderate 
*/ 
public boolean isManage() { 
    return manage; 
} 
/** 
* @param moderate the moderate to set 
*/ 
public void setManage(boolean moderate) { 
    this.manage = moderate; 
    if (moderate){ 
     setWrite(moderate); 
     setRead(moderate); 
    } 
} 
/** 
* @param read the read to set 
*/ 
public void setRead(boolean read) { 
    this.read = read; 
    if (!read){ 
     setWrite(read); 
     setManage(read); 
    } 
} 
/** 
* @return the read 
*/ 
public boolean isRead() { 
    return read; 
} 

}

Quelqu'un peut-il s'il vous plaît indiquer où je vais mal ? Est-ce que j'aboie complètement le mauvais arbre, ou ai-je fait une erreur stupide?

Merci pour votre aide,

Chris

Répondre

2

Il y a certainement quelques étrangetés sur les expressions de chemin jsp nécessaires à cet effet.

J'utilise les valeurs absolues:

applicationDetails['first_name'] 

ou pour votre exemple:

wsPermissions.map['hardcodeduri'].read 

Ces travaux bien pour moi.

Mon conseil est de l'essayer d'abord en dur et ensuite voir si vous pouvez modifier cela pour utiliser la variable dynamique.

1

Comment votre élément de case à cocher HTML n'a-t-il pas d'attribut de nom ou de valeur? Le printemps n'est pas censé faire «tout» la magie pour vous;)

Questions connexes