2011-09-14 2 views
2

ユーザーは、Webアプリケーションでいくつかの設定を行うことができます。特定のサイトにログインすると、他のサイトとは異なる画面を表示/表示することができます。私たちの要件の1つは、現在ログインしているサイトでアクセスできないページの設定を非表示にすることです。現在、これらの要求を処理するためにSpring MVCを使用しています。ここでここに反射が最適ですか?

は、私たちのPOJOの単純化した例である:ここでは

public class Preferences { 
    boolean prefA; //Valid when can do A 
    String prefB; //Valid when can do B 
    Integer prefC; //Valid when can do C 
    .... 
    Long prefZ; //Valid when can do Z 
} 

は、コントローラのコードです:

@RequestMapping(method = RequestMethod.POST, value = "preferences.xhtml") 
public ModelAndView updateRequestPreferences(@ModelAttribute(USER_PREFERENCES) final Preference preferences, final BindingResult results) 
{ 
    return updatePreferences(preferences, results); 
} 

現在updatePreferencesは、反射を行い、それが持続する前に、値がnullでないことを保証します入力の設定 - これは、Spring MVCがPreferencesの新しいインスタンスを作成し、UIにあったもので値を入力するためです。私たちは、好みのセッターで次の操作を行うことができ

public void setPreferences(Preferences preferences) { 
    if (preferences.getPrefA() != null) { 
    this.preferences.setPrefA(preferences.getPrefA()); 
    } 
    if (preferences.getPrefB() != null) { 
    this.preferences.setPrefB(preferences.getPrefB()); 
    } 
    ... 
    if (preferences.getPrefZ() != null) { 
    this.preferences.setPrefZ(preferences.getPrefZ()); 
    } 
} 

これは、setterメソッドでも、すべての検査のためのヘルパー関数で扱いにくい取得(とときを忘れがちステップのように思えるでしょう新しいプリファレンスが作成されます)。同時に反射は警官のように思える。これをリファクタリングするより良い方法はありますか?

+0

リフレクション/イントロスペクションが警官出ません。それは良いデザインです! – JustinKSU

+0

あなたのPreferencesオブジェクトの内容によっては、古き良き名前と値のペアが機能するでしょうか? –

+0

@Paulそれでは、値を格納するためにDB内に別のブロブが必要です(私の前の質問の1つを見ると、これは避けたい)。私は、 "BadDBDesignを拡張する"ために+1を得ました... – Scott

答えて

1

新しいMVCを作成するのではなく、既存のオブジェクトのフィールドに値を設定するようにSpring MVCを設定できます。

例えば、@SessionAttributes(USER_PREFERENCES)を使用すると、Preferencesのインスタンスをフォームのレンダリングとその送信を処理する間のセッションに格納できます。 (そして、あなたのオリジナルのアプローチは同様にそれを必要とする)すべてのケースでは、あなたがセットを指定する必要があること

@ModelAttribute(USER_PREFERENCES) 
public Preferences loadPreferences(@RequestParam("key") String key) { 
    return loadPreferencesByKey(key); 
} 

注:

別のアプローチは、暗黙のモデル属性としてデータベースからPreferencesの新しいインスタンスをロードすることです@InitBinder方法での許可フィールドは、フォームにレンダリングされなかった変更フィールドから悪意のあるユーザを防ぐために:

@InitBinder(USER_PREFERENCES) 
public void initBinder(WebDataBinder b) { 
    b.setAllowedFields("prefA", "prefB"); 
} 
関連する問題