Spring MVC 3.0: Как связать с постоянным объектом
-
01-10-2019 - |
Вопрос
Я работаю с Spring MVC, и я хотел бы привязать постоянный объект AA из базы данных, но я не могу выяснить, как я могу установить свой код, чтобы позвонить в DB перед привязкой. Например, я пытаюсь обновить объект «BenesteTtype» в базу данных, однако я хочу, чтобы он получил объект из базы данных, а не создавать новый, поэтому мне не нужно обновлять все поля.
@RequestMapping("/save")
public String save(@ModelAttribute("item") BenefitType benefitType, BindingResult result)
{
...check for errors
...save, etc.
}
Решение 2
Поэтому я оказался решением этого путем аннотации метода с @Modelattribute одинакового имени в классе. Весна сначала строит модель перед выполнением отображения запросов:
@ModelAttribute("item")
BenefitType getBenefitType(@RequestParam("id") String id) {
// return benefit type
}
Другие советы
Есть несколько вариантов:
В самым простым случае, когда ваш объект имеет только простые свойства, вы можете связать все его свойства по полям формы (
hidden
При необходимости) и получите полностью связанный объект после отправки. Комплексные свойства также могут быть связаны с полями формы с использованиемPropertyEditor
с.Вы также можете использовать сеанс для хранения вашего объекта между
GET
а такжеPOST
Запросы. Весна 3 содействует этот подход с@SessionAttributes
Аннотация (от Петклинический образец):@Controller @RequestMapping("/owners/*/pets/{petId}/edit") @SessionAttributes("pet") // Specify attributes to be stored in the session public class EditPetForm { ... @InitBinder public void setAllowedFields(WebDataBinder dataBinder) { // Disallow binding of sensitive fields - user can't override // values from the session dataBinder.setDisallowedFields("id"); } @RequestMapping(method = RequestMethod.GET) public String setupForm(@PathVariable("petId") int petId, Model model) { Pet pet = this.clinic.loadPet(petId); model.addAttribute("pet", pet); // Put attribute into session return "pets/form"; } @RequestMapping(method = { RequestMethod.PUT, RequestMethod.POST }) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { new PetValidator().validate(pet, result); if (result.hasErrors()) { return "pets/form"; } else { this.clinic.storePet(pet); // Clean the session attribute after successful submit status.setComplete(); return "redirect:/owners/" + pet.getOwner().getId(); } } }
Однако этот подход может вызвать проблемы, если несколько экземпляров формы открыты одновременно на одном сеансе.
Таким образом, наиболее надежный подход к сложным случаям состоит в том, чтобы создать отдельный объект для хранения полей формы и слияния изменений с этого объекта в постоянный объект вручную.
Хотя возможно, что ваша модель домена настолько проста, что вы можете связать объекты пользовательских пользователей непосредственно к объектам модели данных, более вероятно, что это не так, и в этом случае я настоятельно рекомендую вам разработать класс специально для привязки формы, затем Перевести между ним и объектами домена в вашем контроллере.
Я немного запутался. Я думаю, что вы на самом деле говорите о рабочем процессе обновления?
Вам нужно два @requestmaphics, один для получения и один для поста:
@RequestMapping(value="/update/{id}", method=RequestMethod.GET)
public String getSave(ModelMap model, @PathVariable Long id)
{
model.putAttribute("item", benefitDao.findById(id));
return "view";
}
Затем на посту на самом деле обновите поле.
В вашем примере выше, ваш @Modelattribute должен быть уже заполнен способом, таким как вышеуказанный метод, и свойства должны быть связаны с использованием чего-то вроде JSTL или Tapglibs Spring, в сочетании с объектом формы.
Вы также можете посмотреть на Initbinder. В зависимости от вашего использования.