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

red*_*hka 4 java spring spring-mvc

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

@RequestMapping(value="", method = RequestMethod.POST)
@ResponseBody
公共字符串保存(字符串组织){
    logger.info(组织);// 有用
}

任何人都可以指出澄清这种行为的文档吗?我一直认为这@RequestParam是绑定工作的强制性要求。

谢谢

tva*_*zac 6

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

基本上,它向解析器添加了一个 RequestParamMethodArgumentResolver,其中 useDefaultResolution 设置为 true。查看文档我们可以看到,这意味着 BeanUtils.isSimpleProperty(java.lang.Class) 中定义的简单类型的方法参数被视为请求参数,即使它没有注释。请求参数名称源自方法参数名称。