2010-12-02 9 views
24

में एकाधिक चयन ठीक है तो मैं थोड़ी देर के लिए स्प्रिंग एमवीसी में कई चयनों को पूरा करने की कोशिश कर रहा हूं और कोई भाग्य नहीं है।स्प्रिंग 3.0 एमवीसी

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 
} 

इन सभी हाइबरनेट पर मैप किए जाते लेकिन यह है कि एक मुद्दा नहीं होना चाहिए ।

अब मैं जेएसपी में ऐसा करने में सक्षम होना चाहता हूं कि एक कर्मचारी के लिए <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 

मैं हम प्रदान की विकल्पों की सूची से कई का चयन है कि एक मॉडल के लिए एक रूप हो सकता है जहां है जैसे कि यह संभव हो जाना चाहिए महसूस: मैं निम्नलिखित अपवाद मिलता है। स्प्रिंग 3.0 एमवीसी में form:select और form:options होने का सबसे अच्छा अभ्यास क्या है?

धन्यवाद!

समाधान:

ठीक है तो बस मामले में किसी को भी आश्चर्य क्या समाधान है। उपयोगकर्ता 01001111 ठीक करने के अलावा:

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

इस JSP और मॉडल के बीच कौशल के सेट को जोड़ने के लिए वसंत की अनुमति देता है:

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

हम नियंत्रक करने के लिए एक CustomCollectionEditor जोड़ने के लिए इस प्रकार की जरूरत है।

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

${skillOptionList} डाल के बजाय skillOptionList

उत्तर

16

आप के इलाज के लिए आइटम एक चर के रूप में देते हैं, तो बस चर नाम का संदर्भ नहीं की जरूरत है सब? प्रत्येक विकल्प का मान "नाम" है, न कि "आईडी"। लेकिन फिर कनवर्टमेंट विधि में आप प्राप्त तत्व (जो एक नाम है) का इलाज करते हैं, जैसे कि यह आईडी था। मेरा अनुमान है कि यदि आपने प्रत्येक विकल्प के मान को "आईडी" के रूप में सेट करने का प्रयास किया है, तो आपको प्रत्येक विकल्प के मान के रूप में खाली स्ट्रिंग मिल जाएगी, क्योंकि आप गलत PropertyEditor का उपयोग कर रहे हैं।

+0

ठीक है तो इस तरह की मदद की। अब मैं अपने जेएसपी में skillOptionList देख सकता हूं लेकिन सेटस्किल को कभी नहीं बुलाया जाता है और जब मैं सहेजता हूं तो मेरे कर्मचारी के साथ कोई कौशल संबद्ध नहीं होता है। कोई विचार? –

+2

मैंने इसे समझ लिया। यदि आप चाहते हैं तो कृपया कस्टम समाधान चयनकर्ता के बारे में अपने समाधान में हिस्सा जोड़ें जैसा कि किसी और को एक ही समस्या होने पर मेरी पोस्ट में नोट किया गया है। धन्यवाद! –

0

tkeE2036: मुझे आश्चर्य है कि आप कैसे ने कहा कि यह आप के लिए काम किया

1

आप कस्टम संपादकों की जरूरत नहीं है - यह सब मुझे क्या करना है और यह प्रतियां मूल्यों को आगे और पीछे सही ढंग से:

<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

मुझे उपर्युक्त गैर काम मिल गया। नीचे उल्लिखित चीजों के अतिरिक्त मैंने जवाब भी दिया: Spring select multiple tag and binding (बस बराबर बराबर और हैशकोड डालें)। मैंने

पर टिप्पणी के आधार पर initBinder भी बदल दिया है, इसलिए मुझे इससे निपटने में काफी समय लगा, इसलिए मैंने एक ही चीज़ को देखने और मुझे जिन समस्याओं के साथ मुलाकात की, उन्हें संकेत देने का विचार किया।

संबंधित मुद्दे