在Spring MVC选择性结合物业(Selectively Binding a Property

2019-10-28 10:29发布

我有上有一个表单,用户可以保存或删除一个bean的页面。 表单支撑对象具有bean作为其属性。 当用户选择删除一个bean,没有必要到bean绑定,因为JPA只需要bean的id被删除。

反正是有告诉Spring MVC不结合某些特定条件下一个表单支持对象的属性? 我想跳过它的bean属性的绑定,如果该请求是删除。

编辑:我使用Spring 3.下面是伪代码。

@Controller
public class FormController {
    @RequestMapping(method = RequestMethod.POST)
    public void process(HttpServletRequest request) {
        String action = request.getParameter("action");

        if (action.equals("SAVE")) {
            // bind all parameters to the bean property of the FormObject
        }
        else if (action.equals("DELETE")) {
            // skip the binding. manually read the bean.id parameter.
            int id = Integer.valueOf(request.getParameter("bean.id"));
            EntityManager entityManager = ...
            Bean bean = entityManager.getReference(Bean.class, id);
            entityManager.remove(bean);
        }
    }

    public class Bean {
        private int id;
    }

    public class FormObject {
        private Bean bean;
    }
}

Answer 1:

您可以使用各自不同的提交按钮区分name属性请求路由通过这些按钮可以使用不同的处理方法发起并params的属性@RequestMapping 。 例如,在春季3:

<input type = "submit" name = "saveRequest" value = "Save" />
<input type = "submit" name = "deleteRequest" value = "Delete" />

@RequestMapping(value = "/foo", method = RequestMethod.POST, 
    params = {"saveRequest"})
public String saveFoo(@ModelAttribte Foo foo, BindingResult result) { ... }

// Only "id" field is bound for delete request
@RequestMapping(value = "/foo", method = RequestMethod.POST, 
    params = {"deleteRequest"})
public String deleteFoo(@RequestParam("id") long id) { ... }

更“REST式”的方法是把不同的提交按钮成具有不同形式的method = "PUT"method = "DELETE"和由方法区分请求(虽然它需要有一种解决方法HiddenHttpMethodFilter )。



Answer 2:

您可以使用@InitBinder。

@InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id");
    }

看到这里和这里 。



文章来源: Selectively Binding a Property in Spring MVC