2012-01-31 28 views
0

我的控制器代碼有問題。 GET工作正常(包括空表單+形式從數據庫填充),POST只爲創建新對象工作正常,但編輯不起作用。我的@Controller類的一部分:使用@Controller的Spring-MVC 2.5編輯窗體的ID

@RequestMapping(value = "/vehicle_save.html", method = RequestMethod.GET) 
public String setUpForm(@RequestParam(value="id", required = false) Long id, ModelMap model) { 
    Vehicle v; 
    if (id == null) { 
     v = new Vehicle(); 
    } else { 
     v = vehicleManager.findVehicle(id); 
    } 
    model.addAttribute("vehicle", v); 
    return "vehicle_save"; 
} 

@RequestMapping(value = "/vehicle_save.html", method = RequestMethod.POST) 
public String save(@ModelAttribute("vehicle") Vehicle vehicle, BindingResult result, SessionStatus status) { 
    vehicleValidator.validate(vehicle, result); 
    if (result.hasErrors()) { 
     return "vehicle_save"; 
    } 
    if(vehicle.getId() == null) { 
     vehicleManager.createVehicle(vehicle); 
    } else { 
     vehicleManager.updateVehicle(vehicle); 
    } 
    status.setComplete(); 
    return "redirect:vehicle_list.html"; 
} 

第一方法創建的車輛對象(包括其ID)。但是第二種方法獲得的同一個對象沒有ID字段(設置爲空)。

我能做些什麼:手動設置vehicle.setID(id從參數),然後將其保存到數據庫。這導致JPAOptimisticLockException +我不喜歡那個解決方案。

有沒有辦法將我的車輛對象與ID傳遞給第二種方法?順便說一句,我想避免在JSP中添加隱藏的ID字段。

回答

2

你提出的例子是使用session來存儲值。 @SessionAttribute是將現有模型對象綁定到會話。看看源代碼的類都被註解@SessionAttributes("pet")。其中指看代碼EditPetForm類的processSubmit方法

@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); 
      status.setComplete(); //look at its documentation 
      return "redirect:/owners/" + pet.getOwner().getId(); 
     } 
    } 

我havnt用類似名爲「寵物」是獲得存儲在session.Also模型屬性這個以前但我想把你的id在會話中是這樣的

+0

我已經試過了,但在嘗試打開表單時(空或填充),我得到一個奇怪的異常:[>> exception link <<](http:// pastebin .com/D2Qsgzws) – 2012-01-31 11:41:34

+0

編輯:例外只發生在試圖創建新車(不顯示窗體)。現在編輯工作。 – 2012-01-31 11:50:19

+0

更新:問題已解決。@SessionAttributes沒空形式的工作,因爲我已經重寫哈希碼:\t'公衆詮釋的hashCode(){ \t \t如果(ID == NULL){ \t \t \t拋出新IllegalStateException異常( 「無法散列臨時對象」) ; \t \t} \t \t return id.hashCode();'刪除覆蓋後,它工作正常。 – 2012-01-31 12:09:38

1

順便說一句,我想避免在JSP中添加隱藏的ID字段。

這是常用的解決方案。它出什麼問題了 ?你應該用id創建隱藏的輸入。

+0

我想避免它,因爲我認爲這是可以避免的。例如,這個幾乎相同的Spring3示例工程:[Controller](https://src.springframework.org/svn/spring-samples/petclinic/trunk/src/main/java/org/springframework/samples/petclinic/web/ EditPetForm.java),[JSP](https://src.springframework.org/svn/spring-samples/petclinic/trunk/src/main/webapp/WEB-INF/jsp/pets/form.jsp) – 2012-01-31 11:04:35

0

也許你可以嘗試使用會話,導致你不能在兩個請求之間存儲信息。但是我猜這會更醜。 順便說一句,你能解釋一下爲什麼你想避免添加隱藏的領域?我有點好奇

+0

老實說,我沒有管理它與隱藏領域的工作。另一個原因是我沒有在任何教程/例子中看到它,例如在PetClinic應用程序([Controller](https://src.springframework.org/svn/spring-samples/petclinic/trunk/src/main /java/org/springframework/samples/petclinic/web/EditPetForm.java),[JSP](https://src.springframework.org/svn/spring-samples/petclinic/trunk/src/main/webapp/WEB- INF/jsp/pets/form.jsp)) – 2012-01-31 11:11:31