2010-12-02 37 views
24

Ok, donc j'ai essayé d'accomplir plusieurs sélections dans Spring MVC pendant un moment et n'ai pas eu de chance.Multiple Sélectionnez dans Spring 3.0 MVC

En fait ce que j'ai est une classe de compétence:

public class Skill { 
    private Long id; 
    private String name; 
    private String description; 
    //Getters and Setters 
} 

Et un employé qui a de multiples compétences:

public class Employee { 
    private Long id; 
    private String firstname; 
    private String lastname; 
    private Set<Skill> skills; 
    //Getters and Setters 
} 

Tous ces éléments sont mis en correspondance Hibernate, mais cela ne devrait pas être un problème .

Maintenant, je voudrais être en mesure de faire dans le JSP est de sélectionner les compétences pour un employé à partir d'un élément <select multiple="true">.

J'ai essayé dans le JSP avec pas de chance:

<form:select multiple="true" path="skills"> 
    <form:options items="skillOptionList" itemValue="name" itemLabel="name"/> 
<form:select> 

Voici mon contrôleur:

@Controller 
@SessionAttributes 
public class EmployeeController { 
    @Autowired 
    private EmployeeService service; 

    @RequestMapping(value="/addEmployee", method = RequestMethod.POST) 
    public String addSkill(@ModelAttribute("employee") Employee emp, BindingResult result, Map<String, Object> map) { 

     employeeService.addEmployee(emp); 

     return "redirect:/indexEmployee.html"; 
    } 

    @RequestMapping("/indexEmployee") 
    public String listEmployees(@RequestParam(required=false) Integer id, Map<String, Object> map) { 

     Employee emp = (id == null ? new Employee() : employeeService.loadById(id)); 

     map.put("employee", emp); 
     map.put("employeeList", employeeService.listEmployees()); 
     map.put("skillOptionList", skillService.listSkills()); 

     return "emp"; 
    } 
} 

Mais cela ne semble pas fonctionner. Je reçois l'exception suivante:

SEVERE: Servlet.service() for servlet jsp threw exception 
javax.servlet.jsp.JspException: Type [java.lang.String] is not valid for option items 

Je me sens comme il devrait être possible où l'on peut avoir une forme pour un modèle qui a plusieurs choix dans la liste des options offertes. Quelle est la meilleure pratique pour avoir form:select et form:options dans Spring 3.0 MVC?

Merci!

Solution:

Ok, donc au cas où quelqu'un se demande quelle est la solution. En plus de l'utilisateur 01001111 fix:

<form:select multiple="true" path="skills"> 
    <form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/> 
<form:select> 

Nous devons ajouter un CustomCollectionEditor au contrôleur comme suit:

@Controller 
@SessionAttributes 
public class EmployeeController { 

    @Autowired 
    private EmployeeeService employeeService; 

    @Autowired 
    private SkillService skillService; 

    @InitBinder 
    protected void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Set.class, "skills", new CustomCollectionEditor(Set.class) 
      { 
      @Override 
      protected Object convertElement(Object element) 
      { 
       Long id = null; 

       if(element instanceof String && !((String)element).equals("")){ 
        //From the JSP 'element' will be a String 
        try{ 
         id = Long.parseLong((String) element); 
        } 
        catch (NumberFormatException e) { 
         System.out.println("Element was " + ((String) element)); 
         e.printStackTrace(); 
        } 
       } 
       else if(element instanceof Long) { 
        //From the database 'element' will be a Long 
        id = (Long) element; 
       } 

       return id != null ? employeeService.loadSkillById(id) : null; 
      } 
      }); 
    } 
} 

Cela permet d'ajouter Spring ensemble des compétences entre les JSP et le modèle.

Répondre

16

Vous devez traiter les éléments d'attributs comme une variable, pas référence seulement le nom de la variable:

<form:select multiple="true" path="skills"> 
    <form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/> 
</form:select> 

mis ${skillOptionList} au lieu de skillOptionList

+0

Ok donc ce genre de aidé. Je peux maintenant voir le skillOptionList dans ma JSP mais setSkills n'est jamais appelé et aucune compétence n'est associée à mon employé après que je clique sur save. Des idées? –

+2

Je l'ai compris. Si vous le souhaitez, veuillez ajouter la partie relative à CustomCollectionEditor à votre solution, comme indiqué dans mon message au cas où quelqu'un d'autre aurait le même problème. Merci! –

0

tkeE2036: Je me demande comment vous avez dit qu'il a travaillé pour vous à tout? La valeur de chaque option est "nom", pas "id". Mais alors, dans la méthode convertElement, vous traitez l'élément reçu (qui est un nom), comme s'il s'agissait de l'identifiant. Je suppose que si vous essayez de définir la valeur de chaque option comme "id", vous obtiendrez une chaîne vide comme la valeur de chaque option, parce que vous utilisez le mauvais PropertyEditor.

1

Vous n'avez pas besoin des éditeurs personnalisés - ce qui est tout ce que je fais et il copie les valeurs avant et en arrière correctement:

<form:select path="project.resources"> 
    <form:option value="XX"/> 
    <form:option value="YY"/> 
</form:select> 

Project class:- 
private Set<String> resources; 

Voici comment ajouter les données dans le contrôleur:

Set<String> resources3 = new HashSet<String>(); 
resources3.add("XX"); 
0

J'ai trouvé ce qui précède ne fonctionne pas. En plus des choses mentionnées ci-dessous j'ai également utilisé la réponse dans: Spring select multiple tag and binding (simplement mis à côté des égales et hashcode). J'ai également changé initBinder sur la base du commentaire ci-dessus

Il m'a fallu beaucoup de temps pour y faire face alors j'ai pensé donner un indice à tous ceux qui cherchent la même chose et ayant les problèmes que j'ai rencontrés.