SpringMVC的controller同名引數繫結
阿新 • • 發佈:2019-01-26
我們都知道SpringMVC的引數繫結非常方便,只要前臺傳遞的引數在controller的形參列表中找到相同名字的引數就可以將引數值繫結到controller對應的形參上面,就算形參型別是POJO型別也可以繫結(傳遞的引數名與POJO的某屬性名相同,引數值繫結在了POJO的屬性上面)。但是如果前臺傳遞的多個引數中,有兩個或多個引數名相同,那麼controller就不能做到智慧的判斷出哪個引數該繫結在哪個形參上面了,例如:
public class User{
private id;
private name;
}
和
public class Subject{ private id; private name; }
這兩個類中的屬性名都相同。如果前臺同時傳遞了User和Subject的id和name,更巧的是,傳遞的引數名都為id、name。如果controller的宣告剛好為
public void testController(User user,Subject subject){
//...
}
那麼,controller就無法將id和name 繫結到正確的物件上面。
如何解決這樣的問題呢?
經過查詢資料發現,可以通過@InitBinder來解決上面的問題。
在controller中定義如下兩個方法:
@InitBinder("user") public void initUserBinder(WebDataBinder binder){ binder.setFieldDefaultPrefix("User."); } @InitBinder("subject") public void initUserBinder(WebDataBinder binder){ binder.setFieldDefaultPrefix("Subject."); }
在對應的controller中應用註解@ModelAttribute,即
public void testController(@ModelAttribute("user") User user,@ModelAttribute("subject") Subject subject){
//...
}
注意:@ModelAttribute與@InitBinder兩者括號內的字串必須一致。
進行繫結後,只要我們把前臺傳遞的引數名改為User.id、User.name和Subject.id、Subject.name就可以把相應的值繫結到正確的controller形參物件上面了。