Множественный выбор весной 3.0 MVC - PullRequest
25 голосов
/ 02 декабря 2010

Хорошо, поэтому я некоторое время пытался выполнить несколько отборов в Spring MVC, но безуспешно.

В основном у меня есть класс умений:

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

И Сотрудник, имеющий несколько Навыков:

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

Все они сопоставлены с Hibernate, но это не должно быть проблемой.

Теперь я хотел бы иметь возможность сделать вJSP должен выбрать Навыки для Сотрудника из элемента <select multiple="true">.

Я попробовал это в JSP без удачи:

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

Вот мой контроллер:

@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";
    }
}

Но, похоже, это не работает.Я получаю следующее исключение:

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

Мне кажется, что это возможно, когда у нас может быть форма для модели, которая имеет множественный выбор из списка предоставленных опций.Как лучше всего иметь form:select и form:options в Spring 3.0 MVC?

Спасибо!

Решение:

Хорошо, простов случае, если кто-то задается вопросом, каково решение.В дополнение к пользовательскому исправлению 01001111:

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

Нам нужно добавить CustomCollectionEditor в контроллер следующим образом:

@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;
            }
          });
    }
}

Это позволяет Spring добавлять Наборы навыков между JSPи модель.

Ответы [ 4 ]

16 голосов
/ 02 декабря 2010

Вам нужно рассматривать атрибут items как переменную, а не просто ссылаться на имя переменной:

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

поставить ${skillOptionList} вместо skillOptionList

1 голос
/ 23 июля 2013

Я нашел выше не работает. В дополнение к перечисленным ниже вещам я также использовал ответ в: Spring выберите несколько тегов и привязок (Проще говоря, Overide равен и хэш-код). Я также изменил initBinder на основе комментария выше

Мне потребовалось много времени, чтобы справиться с этим, поэтому я подумал дать подсказку любому, кто смотрит то же самое и сталкивается с проблемами, с которыми столкнулся.

1 голос
/ 20 января 2012

Вам не нужны пользовательские редакторы - это все, что я делаю, и оно корректно копирует значения туда-сюда:

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

Project class:-
private Set<String> resources;

Вот как я добавляю данные в контроллер:

Set<String> resources3 = new HashSet<String>();
resources3.add("XX");
0 голосов
/ 04 августа 2011

tkeE2036: Интересно, как вы сказали, что у вас это сработало? Значение каждого параметра - «имя», а не «идентификатор». Но затем в методе convertElement вы обрабатываете полученный элемент (который является именем), как если бы это был идентификатор. Я предполагаю, что если вы попытаетесь установить значение каждого параметра как «id», вы получите пустую строку в качестве значения каждого параметра, потому что вы используете неправильный PropertyEditor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...