2017-10-16 83 views
0

我是新建Builder構件並試圖找到在我的Spring模型中使用構建器模式的方法。如何在構建器模式中使用spring @ModelAttribute

我以前的模型把所有的setter和getter方法,我替換生成器方法和現在的代碼看起來是這樣的:

public class UserInterests { 
    private final String user; 
    private final int interestlevel; 

    private UserInterests(UserInterestBuilder builder) { 
     this.user = builder.user; 
     this.interestlevel = builder.interestlevel; 
    } 

    public String getUser() { 
     return user; 
    } 

    public static class UserInterestBuilder { 
     private String user; 
     private int interestlevel; 

     public UserInterestBuilder() { 
     } 

     public UserInterestBuilder user(final String userId) { 
      this.user = user; 
      return this; 
     } 

     public UserInterestBuilder interestLevel(final int interestLevel) { 
      this.interestLevel = interestLevel; 
      return this; 
     } 

     public UserInterests build() { 
      return new UserInterests(this); 
     } 
    } 
} 

此前,沒有建設者我從UI以用戶interestlevel( jsp)並將其綁定到UserInterests模型。在控制器中,我使用@ModelAttribute獲取UserInterests的實例並使用它。

控制器片段:

@RequestMapping(value = "/addInterest", method = RequestMethod.POST) 
public ModelAndView addUserInterest(
     @ModelAttribute(USER_INTEREST) UserInterests userInterests, 
     BindingResult result, HttpSession session, ModelAndView model) { 
//do something here 
} 

JSP片斷

<html> 
<head></head> 
<body> 
    <form:form modelAttribute="userInterests" action="addInterest" 
method="post"> 
<!-- Do more --> 
</body> 
</html>       

但是,因爲我改變了模型中使用的建設者,我不能用userInterests模型實例作爲此構造函數是私有的。我可以使用request.getParameter()分別獲取用戶和interestlevel值,並使用build綁定到userInterests模型。但有沒有一種方法可以直接使用@ModelAttribute作爲構建器,而不必單獨獲取值。

任何幫助將不勝感激。

回答

0

ModelAttribute註釋由ModelAttributeMethodProcessor處理,屬性通過數據綁定到Servlet請求參數來填充。 Witthin DataBinder的膽量是以下方法,實際執行結合

protected void applyPropertyValues(MutablePropertyValues mpvs) { 
     try { 
      // Bind request parameters onto target object. 
      getPropertyAccessor().setPropertyValues(mpvs, isIgnoreUnknownFields(), isIgnoreInvalidFields()); 
     } 
     catch (PropertyBatchUpdateException ex) { 
      // Use bind error processor to create FieldErrors. 
      for (PropertyAccessException pae : ex.getPropertyAccessExceptions()) { 
       getBindingErrorProcessor().processPropertyAccessException(pae, getInternalBindingResult()); 
      } 
     } 
    } 

看着BeanWrapperImpl這是最常見的屬性訪問器,它具有自動註冊默認property editors從春天包除了基本特徵JDK的標準PropertyEditor,所以基本上它與JavaBeans(基本上屬性和它們的訪問器有特殊的命名約定)完全相關,這意味着它不支持任何其他樣式,比如在你的案例Builder模式中。

+0

那麼,有沒有辦法使用依賴注入來使用構建器模式。 –

+0

如果你想要自動數據綁定功能,那麼你不能。您必須使用構建器API手動將modelAtrribute轉換爲其他對象。 – Shailendra

0

如果您確實想使用您的構建器來注入UserInterests,您可以編寫自己的HandlerMethodArgumentResolver來檢查請求並使用UserInterestBuilder提供UserInterests的實例。特別是,我發現它有點被迫,通過使用Command或Form對象來綁定參數來創建對象,可以使這種情況變得更加簡單。

相關問題