1. 程式人生 > >SpringMVC的controller同名引數繫結

SpringMVC的controller同名引數繫結

我們都知道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形參物件上面了。