Ok, así que he estado tratando de lograr múltiples selecciones en Spring MVC por un tiempo y no he tenido suerte.Selección múltiple en Spring 3.0 MVC
Básicamente lo que tengo es una clase de habilidad:
public class Skill {
private Long id;
private String name;
private String description;
//Getters and Setters
}
Y un empleado que tiene múltiples habilidades:
public class Employee {
private Long id;
private String firstname;
private String lastname;
private Set<Skill> skills;
//Getters and Setters
}
Todos estos se asignan a Hibernate, pero eso no debería ser un problema .
Ahora me gustaría poder hacer en el JSP es seleccionar Habilidades para un empleado de un elemento <select multiple="true">
.
He intentado esto en el JSP sin suerte:
<form:select multiple="true" path="skills">
<form:options items="skillOptionList" itemValue="name" itemLabel="name"/>
<form:select>
Aquí está mi controlador:
@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";
}
}
Pero esto no parece funcionar. Me da la siguiente excepción:
SEVERE: Servlet.service() for servlet jsp threw exception
javax.servlet.jsp.JspException: Type [java.lang.String] is not valid for option items
Siento que debería ser posible donde podemos tener una forma para un modelo que tiene múltiples seleccione de una lista de opciones disponibles. ¿Cuál es la mejor práctica para tener form:select
y form:options
en Spring 3.0 MVC?
Gracias!
Solución:
Ok por lo que sólo en caso de que alguien se pregunta cuál es la solución. Además de usuario 01001111 REVISIÓN:
<form:select multiple="true" path="skills">
<form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/>
<form:select>
Tenemos que añadir un CustomCollectionEditor
al controlador de la siguiente manera:
@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;
}
});
}
}
Esto permite primavera para añadir grupos de habilidades entre la JSP y modelo.
Ok, ese tipo de ayuda. Ahora puedo ver la skillOptionList en mi JSP, pero nunca se llama a setSkills y no hay habilidades asociadas con mi empleado después de hacer clic en guardar. ¿Algunas ideas? –
Lo descubrí. Si lo desea, podría agregar la parte sobre CustomCollectionEditor a su solución como se indica en mi publicación en caso de que alguien más esté teniendo el mismo problema. ¡Gracias! –