I use map to accept parameter, I send an Integer type parameter,I receive a String in Map ,I want use @initbinder to make the value into Integer, but my code don't work. and if I don't write @RequestParam the map will be null. What should I do? any advice are appreciative.
I debugged with spring source code just now ,I find a way to make it:
1.@RequestParam Map map will be resolved by RequestParamMapMethodArgumentResolver 2. I write my bean to overwrite it , so i can change the map value into integer. and i did it
- but,spring find MethodArgumentResolvers in order ,once it find RequestParamMapMethodArgumentResolver ,the loop will break ,so my bean never work.
so is there any way to overwrite default MethodArgumentResolver or remove it?
public class MapEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
System.out.println("+++++++++++++++++++++++++++++++++++");
if(text.matches("\\d+")){
super.setValue(Integer.parseInt(text));
}
super.setAsText(text);
}
@Override
public String getAsText() {
System.out.println("======================================");
return super.getAsText();
}
}
@InitBinder
public void map(WebDataBinder binder){
binder.registerCustomEditor(Map.class,new MapEditor());
binder.registerCustomEditor(Date.class,new DateEditor());
}
@GetMapping("/loadMessageList2")
public String loadMessageList2(@RequestParam Map<String,Object> map){
return "hello world" + map.get("start");
}
----------------after debug--------------------------
public class MyRequestParamMapMethodArgumentResolver extends
RequestParamMapMethodArgumentResolver {
@Override
public Object resolveArgument(MethodParameter parameter, @Nullable
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
Map map = (Map) super.resolveArgument(parameter,mavContainer,webRequest, binderFactory);
Set<Map.Entry> set = map.entrySet();
for (Map.Entry entry : set) {
if(entry.getValue().toString().matches("\\d+")){
entry.setValue(Integer.parseInt(entry.getValue().toString()));
}
}
return map;
}
}
and register it
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver>
argumentResolvers) {
argumentResolvers.add(new MyRequestParamMapMethodArgumentResolver());
}
}