Выборочное связывание свойства в Spring MVC - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть страница, на которой есть форма, где пользователь может сохранить или удалить бин. Объект поддержки формы имеет боб в качестве своего свойства. Когда пользователь выбирает удалить компонент, нет необходимости связывать компонент, поскольку JPA требует только удаления идентификатора компонента.

Можно ли как-то сказать 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;
    }
}

Ответы [ 2 ]

4 голосов
/ 08 ноября 2010

Можно различать разные кнопки отправки, используя их атрибут 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) { ... }

Более "подход RESTful" заключался бы в размещении разных кнопок отправки в разных формах с method = "PUT" и method = "DELETE" и различении запросов по методу (хотя для этого требуется обходной путь с HiddenHttpMethodFilter).

3 голосов
/ 04 сентября 2012

Вы можете использовать @InitBinder.

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

см. здесь и здесь .

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