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.
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? –
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! –