省略了@RequestParam,但映射仍然正确完成

时间:2017-12-25 08:38:06

标签: java spring spring-mvc

我刚刚发现,即使我省略了@RequestParam参数上的organization注释,Spring仍然能够绑定它。

@RequestMapping(value="", method = RequestMethod.POST)
@ResponseBody
public String save(String organization){
    logger.info(organization); // it works
}

任何人都可以指出澄清此行为的文档吗?我始终认为@RequestParam是绑定工作所必需的。

由于

4 个答案:

答案 0 :(得分:1)

看看https://reversecoding.net/spring-mvc-requestparam-binding-request-parameters/有一个解释:

  

没有@RequestParam的例子

     

基于列表   在您的应用程序中配置HandlerMethodArgumentResolver,   @RequestParam也可以省略。如果你看一下代码   RequestMappingHandlerAdapter的方法getDefaultArgumentResolvers()   最后有一段代码:

     

// Catch-all resolvers.add(new   RequestParamMethodArgumentResolver(getBeanFactory(),true));

     

resolvers.add(new ServletModelAttributeMethodProcessor(true));

     

// Catch-all resolvers.add(new   RequestParamMethodArgumentResolver(getBeanFactory(),true));

     

resolvers.add(new ServletModelAttributeMethodProcessor(true));

     

基本上,它被添加到解析器a   RequestParamMethodArgumentResolver,useDefaultResolution设置为   真正。查看文档,我们可以看到这意味着   方法参数,它是一个简单类型,如中所定义   BeanUtils.isSimpleProperty(java.lang.Class)被视为   请求参数,即使它没有注释。请求参数   name是从方法参数名称派生的。

答案 1 :(得分:1)

您的解析器会自动执行此操作。当您将HandlerMethodArgumentResolver bean传递给解析程序时,BeanUtil checks如果参数是原始值或简单String。如果是这样,它就会自行绑定。

答案 2 :(得分:-1)

@RequestMapping(value = "/rest")
@ResponseBody
public String save(String username, String password) {
    return String.format("username=%s  password=%s", username, password);
}

点击服务http://localhost:8080/rest?username=mypwd&password=uname

您将能够看到下面给出的结果。

  

输出用户名= pwd密码= uname

答案 3 :(得分:-2)

这里有一些@RequestParam为您提供的示例,希望他们可以帮助您: @RequestMapping(value = "/selection/findByField", method = RequestMethod.POST) public @ResponseBody List<selectionsDO> add(@RequestParam(value = "field", required = true) String field,@RequestParam(value = "value", required = true) String value) { return mongoService.findByField(field,value); }

单词“required = true”表示该字段必须在请求时提交。