Spring @RequestParam不能正确处理多个变量 - 示例测试用例

时间:2011-03-14 08:12:54

标签: java spring-mvc

下面给出的测试用例显示了一个简单的案例,其中我有2个参数paramAparamB

  • 如果我调用/paramtest网址,则会调用paramtest()方法。
  • 如果我为true输入paramA,则会调用方法aTrue()
  • 但是,当我为trueparamA输入paramB时,会调用方法bTrueNotA()

但是第3 @RequestMapping次要求A=TrueB!=true。通过我在两个参数都为真时进行重新调整,应该调用aTrue()

@RequestMapping("paramtest")
@ResponseBody
public String paramtest(){
    return  "<html><head></head><body>" +
                "<form action=paramtest method=post>" +
                    "paramA: <input type=text name=paramA /><br>" +
                    "paramB: <input type=text name=paramB /><br>" +
                    "<input type=submit>" + 
                "</form>" +
            "</body></html>";       
}

@RequestMapping(value="paramtest", params="paramA=true")
@ResponseBody
public String aTrue(){
    return "A=true";
}

@RequestMapping(value="paramtest", params={"paramB=true", "paramA!=true"})
@ResponseBody
public String bTrueNotA(){
    return "B=True; A!=true";
}

1 个答案:

答案 0 :(得分:1)

我认为这可能是Spring中的一个错误。我尝试了以下映射:

@RequestMapping(value="/paramtest", params={"paramA=true"})
@ResponseBody
public String function A() { return "A"; }

@RequestMapping(value="/paramtest", params={"paramA=true", "paramB=foobar"})
@ResponseBody
public String function B() { return "B"; }

@RequestMapping(value="/paramtest", params={"paramA=!true", "paramB=foo"})
@ResponseBody
public String function C() { return "C"; }

并使用包含以下参数的现有表单,这些是我得到的结果:

paramA=true A()按预期调用

paramA=true, paramB=foobar B()按预期调用

paramA=not_true, paramB=foo 404页面,而不是预期的C()。

我在Tomcat控制台上遇到了这个错误:

WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver 142 - No matching handler method found for servlet request: path '/paramtest', method 'POST', parameters map['paramB' -> array<String>['foo'], 'paramA' -> array<String>['not_true']]

所有这些都是Spring 3.0.5。请注意,myParam!=myValue仅在Spring 3.0.4之后可用(3.0.3 doc未列出该选项)。此外,我认为!myParam=myValue无效,因为current 3.0.5 documentation中未列出此内容。

很抱歉,这不是您问题的解决方案,但想分享我的调查:)