【问题标题】:Why ModelAtribute passed as null?为什么 ModelAtribute 作为 null 传递?
【发布时间】:2013-10-25 23:30:47
【问题描述】:

我开发了下一个目标类

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()); 

我看到了

这是什么原因?

如何解决?

【问题讨论】:

    标签: java testing spring-mvc request mockito


    【解决方案1】:

    这是因为你的 mockMvc 请求中的sessionAttr("person", person)person 设置为会话属性,而@ModelAttribute 注释了模型属性

    要将会话变量放入模型中(从而解决您的问题),请使用@SessionAttributes 注释:

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

    阅读更多here

    顺便说一句,你的控制器应该是public,而不是private static

    【讨论】:

    • 你是对的。但也许以其他方式存在。我认为如果测试代码影响正常代码是不好的方法
    • 另一种选择是使用常规的.param() 方法而不是sessionAttr() 发送数据,但这也会影响您的控制器,因为您需要使用@RequestParam 而不是@ModelAttribute("person ")`。在不知道您想要实现什么的情况下,很难判断哪种解决方案是最好的。
    • 我猜你只是想将person 作为参数传递给控制器​​,然后将人名添加到模型并返回一个视图。如果是这种情况,您可能需要使用我之前评论中的解决方案。
    • @gstackoverflow。这是设置 SessionAttribute 的正确方法。我做了同样的事情
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2011-12-05
    • 2018-11-10
    相关资源
    最近更新 更多