2010-12-02 19 views
24

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.

Respuesta

16

que necesita para tratar los artículos atribuyen como una variable, no sólo hacer referencia al nombre de la variable:

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

poner ${skillOptionList} en lugar de skillOptionList

+0

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

+2

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

0

tkeE2036: Me pregunto cómo usted dijo que trabajó para usted en ¿todas? El valor de cada opción es "nombre", no "id". Pero luego en el método convertElement trata el elemento recibido (que es un nombre), como si fuera el id. Supongo que si intentas establecer el valor de cada opción como "id", obtendrías una cadena vacía como el valor de cada opción, porque estás usando el PropertyEditor incorrecto.

1

No es necesario los editores personalizados - esto es todo lo que hago y copia los valores de ida y vuelta correctamente:

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

Project class:- 
private Set<String> resources; 

éste es cómo añadir los datos en el controlador:

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

He encontrado que el anterior no funciona. Además de las cosas que se mencionan a continuación, también utilicé la respuesta en: Spring select multiple tag and binding (simplemente ponga overide equals y hashcode). También he cambiado initBinder basado en el comentario anterior

Me tomó mucho tiempo para manejarlo, así que pensé dar una pista a cualquiera que tuviera el mismo aspecto y que tuviese los problemas que tuve.

Cuestiones relacionadas