2013-03-01 95 views
0

我正在使用RESTful請求開發一個新的Spring MVC應用程序。應用程序執行標準數據庫加載對象,綁定值並保存。爲了不丟失窗體上不可用的對象值,我使用@ModelAttribute方法在綁定之前預先加載對象。Spring MVC @ModelAttribute與REST不兼容

當使用URL

/agency/418

我@ModelAttribute方法現在 '418' ID的學習方式加載機構。我的理解是,只有正規的請求的屬性可以被處理,所以我的網址將需要

/agency/418?id=418

這有點打破了RESTful模式。發佈數據時同樣的事情。

有人可能對此觀察發表評論...我錯過了什麼嗎?

感謝 西蒙

+0

我的評論將是你正在嘗試使用ModelAttribute函數的東西,而不是它的意思。這並不意味着預先填充用於RESTful服務調用的對象,而是爲了簡化表單數據和控制器之間的綁定。這些數據會被POST'ed或GET'ed,在這種意義上你是正確的,你必須傳遞值才能做你正在嘗試的,但我認爲你的milage會有所不同。 – CodeChimp 2013-03-01 19:29:21

+0

http://stackoverflow.com/questions/3672100/spring-mvc-3-0-how-do-i-bind-to-a-persistent-object建議使用表單對象進行綁定...我會看看那個。 – Simon 2013-03-05 09:54:57

+0

有兩個地方可以放置ModelAttribute註釋。第一個是視圖處理器方法的參數。在這種情況下,用法是在表單和處理程序之間提供綁定。第二種方法是將它放在一個不帶參數的方法上,並返回目標ModelAttribute的新實例。這通常是一種私人方法。這樣做的目的是在處理程序定義不在Model或HttpSession中的ModelAttribute時創建默認版本。然後調用此方法來創建一個空的初始化實例,供視圖處理程序方法使用。 – CodeChimp 2013-03-05 14:14:10

回答

1

可以很好地使用pathvariable到initialze一個的ModelAttribute:

@controller 
public controller { 
    @modelattribute("model") 
    public Entity initentity(@pathvariable integer id) { 
    return dao.getentity(id); 
    } 

    @requestmapping("/{id}") 
    public String somerequest(@modelattribute("model") Entity entity) { 
     .... 
    }  
} 
+0

我相信https://jira.springsource.org/browse/SPR-5500可以準確地涵蓋主題。 – Simon 2013-03-04 14:01:49

+0

這是一個很好的指針。我們遇到了這個問題,並按照第二條評論中描述的方式用分離控制器解決了這個問題。從我的角度來看,它是一個乾淨的解決方案。 – 2013-03-07 06:07:27

0

我們放棄了使用@ModelAttribute更換的想法是什麼在曾經是「formBackingObject」 Spring 2.相反,我們使用純表單對象類進行表單綁定,然後將值複製到持久實體。表單對象可以由Spring即時創建,因此我們不再需要具有數據庫加載的@ModelAttribute。該主題涵蓋在Does Spring MVC require copy/paste of Entity to FormObject?

相關問題