将URL查询字符串参数追溯绑定到Spring MVC中的对象

时间:2015-08-04 16:23:51

标签: java spring spring-mvc

我有一个通用控制器,有很多方法,支持各种查询参数组合和媒体类型。当子类化这个控制器时,我想添加一些额外的查询字符串参数绑定。但是,由于无法覆盖@RequestMapping注释,因此最好的做法是使用覆盖方法从每个方法获取HttpServletRequest并吐出自定义的映射对象:

public class GenericController<T,ID>{

    @RequestMapping(value = "/search", method = RequestMethod.GET, 
        produces = { MediaType.APPLICATION_JSON_VALUE })
    public HttpEntity findById(HttpServletRequest request){
        Map<String,Object> params = queryStringToParams(request.getParameterMap());
        List<T> results = repository.find(params);
        return new ResponseEntity<>(results, HttpStatus.OK);
    }

    protected Map<String,Object> queryStringToParams(Map<String,String[]> qsParams){
        // magic happens here
    }

}    

我的问题:是否有可能利用Spring解析控制器方法参数后用于转换@RequestParam参数的现有参数解析器的功能?将查询字符串格式的字符串参数转换为Java对象的功能显然已在此处实现,编写自己的对象映射器将是愚蠢的。

1 个答案:

答案 0 :(得分:0)

原来我正在寻找的是Spring ConversionService。通过注入容器的现有ConversionService ...

,我可以实现参数绑定的预期效果
@Autowired ConversionService conversionService;

...
Float number = conversionService.convert((String) qsParams.get("number")[0], Float.class);
...

...其中包含可能已创建的任何自定义转换器。或者,我可以使用默认的ConversionService实施DefaultConversionService

ConversionService conversionService = new DefaultConversionService();