我只是花了一些时间对Spring MVC的默认处理程序方法参数解析的一个方面进行故障排除,我想问那些靠近项目的人是否打算这样做,或者是否有理由建议修改建议
问题与方法参数中POJO样式对象的默认分辨率有关,如下所示:
@RequestMapping("/endpointwithparams")
public String endpointWithParams(EndpointParams params) {
// Do some stuff
return "viewname";
}
在没有注释或自定义参数解析器的情况下,Spring将尝试通过将请求参数与其字段名称匹配来绑定EndpointParams对象。如果配置了验证器,它将甚至运行验证器。这似乎很棒-它使我可以编写简单的POJO对象来组织相关的参数集,而不必为每个参数都具有自定义参数解析器。
让我失望的是,创建EndpointParams对象后,它会也自动添加到模型中。这是因为此参数的实际解析器将是ModelAttributeMethodProcessor,其“ annotationNotRequired”标志设置为true。我不希望将此参数添加到模型中-它的存在会带来一些麻烦-并且对我来说当然不直观,我应该期望对未使用@ModelAttribute注释的参数进行添加。
此行为也与当您具有“简单”请求参数时发生的情况不一致:
@RequestMapping("/endpointwithparams")
public String endpointWithParams(String param) {
// Do some stuff
return "viewname";
}
在上面的示例中,String参数将由RequestParamMethodArgumentResolver解析,这将不向模型添加任何内容。
合理地建议非注释的POJO参数的更好的默认逻辑与当前发生的绑定和验证相同,但没有自动添加到模型中?还是缺少一些使完整的@ModelAttribute行为成为最佳默认选择的上下文?