Ben*_*n M 7 spring spring-mvc http-request-parameters spring-boot spring-4
@RestController
class MyController {
@RequestMapping(...)
public void test(Container container) { ... }
}
Run Code Online (Sandbox Code Playgroud)
Spring默认使用Dot-Notation反序列化嵌套的@RequestParam:
class Container {
A a;
}
class A {
String val;
}
Run Code Online (Sandbox Code Playgroud)
适用于:
http://.../myController?a.val=foo
Run Code Online (Sandbox Code Playgroud)
但对于地图,它使用方形括号表示法:
class Container {
Map<String, String> a;
}
Run Code Online (Sandbox Code Playgroud)
适用于:
http://.../myController?a[val]=foo
Run Code Online (Sandbox Code Playgroud)
当使用JavaScript时,HashMap和嵌套对象之间当然没有区别,因此所有内容都将使用Dots 或 Square-Brackets进行序列化.
如何/我在哪里可以告诉Spring(或Spring启动,如果这更容易)使用点符号(或方括号中)为两个,嵌套对象和地图?
或者,有什么理由说Spring会对这些类型产生影响吗?
由于其自定义DataBinder子类RelaxedDataBinder,Spring Boot 支持使用点分隔路径来绑定地图。好消息是它也是DataBinderSpring MVC 中用来执行请求参数绑定的一个。坏消息是插入你自己的活页夹并不简单,它需要是一个WebDataBinder. 你可以通过声明你自己的RequestMappingHandlerAdapterbean来插入一个名为requestMappingHandlerAdapter. 例如:
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdpter() {
return new RequestMappingHandlerAdapter() {
@Override
protected InitBinderDataBinderFactory createDataBinderFactory(
List<InvocableHandlerMethod> binderMethods)
throws Exception {
return new ServletRequestDataBinderFactory(binderMethods, getWebBindingInitializer()) {
@Override
protected ServletRequestDataBinder createBinderInstance(
final Object target, String objectName,
NativeWebRequest request) {
return new ServletRequestDataBinder(target) {
private RelaxedDataBinder relaxedBinder = new RelaxedDataBinder(target);
@Override
protected void doBind(MutablePropertyValues mpvs) {
this.relaxedBinder.bind(mpvs);
}
};
}
};
}
};
}
Run Code Online (Sandbox Code Playgroud)
您可能想重构它以避免使用多个嵌套的匿名内部类,但它希望说明一般方法。
| 归档时间: |
|
| 查看次数: |
2170 次 |
| 最近记录: |