我有一个通用控制器,有很多方法,支持各种查询参数组合和媒体类型。当子类化这个控制器时,我想添加一些额外的查询字符串参数绑定。但是,由于无法覆盖@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对象的功能显然已在此处实现,编写自己的对象映射器将是愚蠢的。
答案 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();