如何在spring mvc框架中为对象的LIST做映射

Man*_*ain 2 spring-mvc

我有以下POJO 类作为输入 -

public class Input implements java.io.Serializable {

    private String id;
    private List<Inputbenefit> Inputbenefits;
    //and getter and setter method 
}
Run Code Online (Sandbox Code Playgroud)

现在在控制器中我有 initbinder -

@InitBinder
public void initBinder(Object target,WebDataBinder binder) {  
    binder.registerCustomEditor(ArrayList.class, new CustomCollectionEditor(ArrayList.class) {   
        @Override  
        protected Object convertElement(Object element) {
            Input  input= new Input ();     
            if (element != null) {
                ArrayList<Inputbenefit> id = (ArrayList<Inputbenefit>) element;
                input.setInputbenefits(id);
            }
        return input;
    } 
});   
Run Code Online (Sandbox Code Playgroud)

控制器中的 Post 方法签名是 -

@RequestMapping(value = "/addDependentOutput.html", method = RequestMethod.POST)
public String OutputForm(@ModelAttribute("Input") Input input, BindingResult result, Model model) 
Run Code Online (Sandbox Code Playgroud)

在 JSP 中- 我有 5 个固定的文本框来为 Input 类赋值 -

<spring:bind path="inputbenefits.benefitId">                
    <form:input path="${status.expression}" size="10" value="Manisha"/>
</spring:bind>
Run Code Online (Sandbox Code Playgroud)

我没有从 html 表单到 OutputForm 获取值,即无法读取inputbenefits.benefitId控制器 post 方法 OutputForm 中的字段值。

简而言之 - 我的 List 对象值没有传递给控制器​​方法。

请帮忙。谢谢。

Geo*_*zov 5

你不应该从 converElement 方法返回宿主对象,你应该返回你的集合对象

        @Override  
        protected Object convertElement(Object element) {
            int benefitId = Integer.parseInt(element.toString());
            return benefitService.getById(benefitId);
        } 
Run Code Online (Sandbox Code Playgroud)

更新

我假设您试图将收益集合绑定到您的 Input 对象,并且您有一个表单来创建新的 Input 并选择控件来选择所需的收益。对?如果是真的,你需要这样的东西

使用表单弹簧标签

        <form:select path="inputBenefits" items="${benefits}" 
         multiple="multiple" size="5" itemLabel="additionalAmt" itemValue="benefitId"/>
        <form:errors path="inputBenefits"/>
Run Code Online (Sandbox Code Playgroud)

其中 ${benefits} 您路径到页面的可用好处集合

在您的控制器中,您需要

@InitBinder
    public void initBinder(ServletRequestDataBinder binder) {
     binder.registerCustomEditor(List.class, "inputBenefits", new CustomCollectionEditor(List.class) {

            protected Object convertElement(Object element) {
                if (element != null) {
                    Integer benefitId = Integer.parseInt(element.toString());
                    Benefit benefit = benefitService.getById(benefitId); // something that able to get benefit object
                    return benefit;

                }
                return null;
            }

        });

    }
Run Code Online (Sandbox Code Playgroud)

这种方法 convertElement 将为页面选择控件上选择的每个值调用。之后,利益的集合将被推送到命令表单对象(我想是输入)

这里的简单例子http://www.tutorialspoint.com/spring/spring_mvc_form_handling_example.htm