2012-01-05 10 views
4

Myドメインオブジェクトは、JSPファイル内で明示的に参照されていない値を、同じコントローラ上のGET操作とPOST操作の間で保持しません。ここには、エラーチェックを省略したサンプルがあります。Spring MVC 3 GET操作とPOST操作の間にコマンドオブジェクト値が失われる

私はドメインオブジェクトを持っています。

class foo 
{ 
    private int fieldA; 
    private String fieldB; 
    // .. getters and setters omitted 
} 

コントローラ

@Controller 
public class MyController 
{ 
@Autowired 
private IDaoService daoService; 

@RequestMapping(value = "/display", method = RequestMethod.GET) 
public String newForm(@RequestParam("id") Long id, Model model, Principal principal) throws Exception 
{ 
    // check that the user has permissions 
    ... 

    // get the object 
    Foo foo = daoService.read(id); 
    // at this point foo.fieldA is equal to the input id 
    model.addAttribute("foo", foo); 

    // return the JSP path 
} 

@RequestMapping(value="/update", method = RequestMethod.POST) 
public String update(@ModelAttribute("foo") Foo foo, 
     BindingResult result, 
     Principal principal, 
     Model model) throws Exception 

{ 
    // ERROR - at this point, fieldA is null 

} 
} 

JSP

<form:form method="post" commandName="foo"> 
     <fieldset> 
      <legend>Invest</legend> 
      <div class="fm-req"> 
       <label for="fm-name">Field B</label>  
       <spring:bind path="fieldB"> 
        <input id="fm-name" type="text" name="${status.expression}" value="${status.value}" ></input> 
       </spring:bind> 
      </div> 
      <div id="fm-submit" class="fm-req"> 
       <INPUT type="submit" value="Submit" name="Submit" />   
      </div> 
     </fieldset> 
    </form:form>     

私は、JSPはFIELDAセット(おそらくFIELDBを)持っているNEWFORMで作成されたオブジェクトを取得することを考えているだろう。ユーザーはfieldBを変更してからsubmitを押すという選択肢があります。 私は、春のドキュメントやチェック済みのWebサイトをたくさん読んだことがありますが、foo.fieldAがコントローラの更新メソッドでnullである理由がわかりません。

私がSpring MVCについて理解していることから、これは標準的なパターンのようですが、私を修正してください。

ありがとうございます。

+0

モデルがセッション中でない場合、なぜでしょうか? –

+0

私は、JSPがコマンドオブジェクトにアクセスできるように、newForm()へのモデル入力がセッション内のモデルであることを前提としていました。新しいモデルを作成する必要がありますか、セッションにあるモデルを入手するにはどうすればよいですか? Thx – user1132294

+0

デフォルトでは、モデルは要求に含まれています。 –

答えて

0

これは予期した動作です。

オブジェクトfooの両方のインスタンス(newFormupdateでは)(Javaクラス名で大文字で始まるべきである)は、互いの完全independendあります。

隠されたフィールドを作成したり、セッションに入れるようにしてください。 私は隠しフィールドをお勧めします:

+0

セッションではなく、隠しフィールドを使用する特別な理由はありますか? Foo(!)オブジェクトに20個のフィールドがある場合、20個の隠しフィールドを定義する必要はありませんか? – user1132294

+0

フィールがhtmlファイルにある場合、それらはそのフォームに強くアタッチされます。 - >ユーザーが別のタブまたはいくつかのブラウザを使用する場合は問題ありません。そして、私はセッションから何も使われていないものをクリアすることを考えるのに時間を費やす必要はありません。 (他の理由は、隠されたフィールドがサーバーにあまり負荷をかけないということです) - そして、私はgetherに属するすべての考えを同じ場所に置くのがよりクリーンであるという強い感情を持っています(htmlやセッション)。 – Ralph

+0

私たちの問題は他の問題になるかもしれません。 - ドメインエンティティ用に1つ、更新フォーム/コマンド用に別々のクラスを使用する必要があります。このフォーム/コマンドオブジェクトには、フォームにあるフィールドだけが必要です。 – Ralph

1

あなたは、次のいずれかを使用できます隠しフィールドの

  1. 利用ラルフの方法。
  2. プライベート整数のFoo
  3. にFoo.fieldAの変化型

理由は次のようになります。NULL値がタイプFIELDAをintに設定されている、ためFoo.fieldAは、問題を作成しています。

関連する問題