spring - 为映射和/或嵌套对象自定义 Spring @RequestParam 反序列化

标签 spring spring-mvc spring-boot spring-4 http-request-parameters

@RestController
class MyController {
     @RequestMapping(...)
     public void test(Container container) { ... }
}

Spring 默认使用 Dot-Notation 来反序列化嵌套的 @RequestParam:

class Container {
    A a;
}

class A {
    String val;
}

适用于:

http://.../myController?a.val=foo
<小时/>

但对于 map ,它使用方括号表示法:

class Container {
    Map<String, String> a;
}

适用于:

http://.../myController?a[val]=foo
<小时/>

使用 JavaScript 时,HashMap 和嵌套对象当然没有区别,因此所有内容都将使用点方括号进行序列化。

<小时/>

问题:

如何/在哪里可以告诉 Spring(或 Spring Boot,如果更容易的话)对两者、嵌套对象映射使用点表示法(或方括号)?

或者Spring有什么理由在这些类型之间做出区分吗?

最佳答案

Spring Boot 支持使用点分隔路径来绑定(bind)映射,这要归功于它的自定义 DataBinder 子类 RelaxedDataBinder 。好消息是它也是 Spring MVC 中用于执行请求参数绑定(bind)的 DataBinder。坏消息是插入您自己的绑定(bind)器并不简单,并且它需要是一个 WebDataBinder。您可以通过声明自己的名为 requestMappingHandlerAdapterRequestMappingHandlerAdapter bean 来插入一个。例如:

@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);
                        }
                    };
                }
            };
        }   
    };
}

您可能很想重构它以避免使用多个嵌套的匿名内部类,但它希望说明一般方法。

关于spring - 为映射和/或嵌套对象自定义 Spring @RequestParam 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28349488/

相关文章:

java - Spring Boot MVC/Rest Controller 和枚举反序列化转换器

java - 无法打开使用 spring-boot 下载的 S3 zip 文件

spring-boot - spring boot 2 中 jwt.key-uri 的替代品是什么

java - 如何在 Spring 4 上正确使用 Models?

java - 同步数据提交

java - Spring、Hibernate : Database call complete for saving object, 但有时返回 null 值

java - XML 命名空间如何在没有工作网络连接的情况下工作?

java - 如何使用从远程服务器获取的属性文件配置数据库连接

java - 处理自定义 View 解析器抛出的异常

java - Spring FileSystemResource NoSuchFileException