2013-03-05 51 views
2

我正在開發我的第一個Spring 3 Web應用程序。在Spring 2中,我們使用formBackingObject從數據庫加載數據,然後讓Spring綁定更新一些字段,然後onSubmit將持續這些更改。Spring MVC是否需要複製/粘貼Entity到FormObject?

在春季3,看來我有兩個選擇:

  1. 讓用戶編輯持久化對象的100%。這意味着,該對象的ID將需要的隱藏字段
  2. 創建其持有的可編輯數據的表單對象,然後其映射到對持久對象提交

第一個選項是不是真正的選項,我們不能讓用戶編輯所有字段,而且我們寧願不在隱藏字段中顯示任何能夠按F12的人都可以更改值的數據。

第二種選擇似乎是一個體面的設計方法。但是,它似乎需要基本克隆每個可編輯的持久類。

@Entity 
public class Company { 
    private String uuid; // not editable! 
    .. 30 other properties, 2 are not editable 
} 

public class CompanyForm { 
    .. 28 of above properties 
} 

,然後用大量的

public void map(CompanyForm cf, Company c) { 
    cf.setName(c.getName()); 
    .. 27 other set(get()) 
} 

我祈禱這一些映射機制不是「作爲設計的」 Spring的MVC的方式結合。然而,迄今爲止我發現的所有教程都非常簡單,從上面實現選項1。有沒有人對實施選項2有一些建議?

謝謝,西蒙

回答

2

DataBinder的API

注意,有在未按照規定允許的字段數組潛在的安全隱患。例如,對於HTTP形式的POST數據,惡意客戶可以通過爲表單中不存在的字段或屬性提供值來嘗試顛覆應用程序。在某些情況下,這可能會導致在命令對象或其嵌套對象上設置非法數據。因此,強烈建議在DataBinder上指定allowedFields屬性。

您可以選擇1

0

的實用方法一起使用它是隻忽略的更新語句不編輯的字段。

0

我實際上通過使用@ModelAttribute註釋和檢測請求中的PK來繞過這個,如果你這樣做的話Spring將使用從@ModelAttribute返回的對象並自動將提交的對象複製到它。

這是一種黑客攻擊,對於那些維護代碼的人來說並不明顯。