2017-10-16 16 views
0

私はBuilderパターンを初めて使用し、SpringモデルでBuilderパターンを使用する方法を理解しようとしています。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は、私はビルダーを使用するようにモデルを変更するので、こののコンストラクタがプライベートであると、私はモデルインスタンスをuserInterests使用することはできません、

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

をスニペットしかし。私は、request.getParameter()を使用してuserとinterestlevelの値を別々に取得し、buildを使用してuserInterestsモデルにバインドできます。しかし、@ModelAttributeを直接ビルダーに使用して、別々に値を取得する必要はありません。

ご協力いただきますようお願い申し上げます。

答えて

0

注釈はModelAttributeMethodProcessorによって処理され、属性はサーブレット要求パラメータへのデータバインディングによって設定されます。 DataBinderの根性Witthin が実際に結合

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の標準PropertyEditorsなので、基本的にはJavaBeans(基本的にプロパティと特別な命名規則を持つアクセサ)に完全にリンクしています。つまり、ケースビルダーパターンのような他のスタイルをサポートしていません。

+0

私の依存性注入でビルダーパターンを使用する方法はありますか? –

+0

自動データバインディング機能が必要な場合は、できません。 Builder APIを使用してmodelAtributeを他のオブジェクトに手動で変換する必要があります。 – Shailendra

0

実際にBuilderを使用してUserInterestsを注入する場合は、要求を検査してUserInterestBuilderを使用してUserInterestsのインスタンスを提供する独自のHandlerMethodArgumentResolverを記述することができます。特に、私はそれが少し強制され、このシナリオは、CommandオブジェクトまたはFormオブジェクトを使用してパラメータをバインドすることによってオブジェクトを作成することによって、よりシンプルにすることができます。

関連する問題