1

次のターゲットクラスを開発しました

class Person{
    public Person(){}
    public Person(String name) {
        super();
        this.name = name;
    }

    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

次のコントローラー:

@Controller
        private static class SampleController {


                @RequestMapping(value="/path", method=RequestMethod.POST)
                public String path(@Valid @ModelAttribute("person") Person person, BindingResult result, Model model) {
                    model.addAttribute("name",person.getName()); 
                    System.out.println(person.getName());
                    return "view";
                }
        }

そして次のテスト:

public class ModelAssertionTests {

        private MockMvc mockMvc;

        @Before
        public void setup() {

                SampleController controller = new SampleController("a string value", 3, new Person("a name"));

                this.mockMvc = standaloneSetup(controller)
                                .defaultRequest(get("/"))
                                .alwaysExpect(status().isOk())
                                .build();
        }
        @Test
        public void testTest() throws Exception {
                Person person = new Person("name");
                mockMvc.perform(post("/path").sessionAttr("person", person));
        }
}

デバッグモードをオンにする

この行で:

 mockMvc.perform(post("/path").sessionAttr("person", person));

私はそれを見る

ここに画像の説明を入力

コントローラーメソッドに移動すると:

 model.addAttribute("name",person.getName()); 

私はそれを見る

ここに画像の説明を入力

その理由は何ですか?

修正方法は?

4

1 に答える 1

3

これはsessionAttr("person", person)、mockMvc リクエストがセッション属性personとして設定され、モデル属性に注釈が付けられているためです。@ModelAttribute

セッション変数をモデルに入れる (したがって問題を解決する) には、@SessionAttributes注釈を使用します。

@Controller
@SessionAttributes("person")
private static class SampleController {
    ...
}

詳細はこちらをご覧ください

ちなみに、コントローラーはpublicではなくである必要がありますprivate static

于 2013-10-17T15:11:59.903 に答える