spring mvc:当请求content-type为x-www-form-urlencoded时绑定嵌套请求参数

时间:2018-05-07 09:22:48

标签: spring-mvc spring-boot

请求参数:

{
    "username": "aaa",
    "password": "bbb",
    "detail": {
        "gender": "ccc",
        "location": "ddd"
    }
}

我希望使用以下命令获取Spring MVC中的请求参数:

@RequestMapping(value = "/test")
public String test(User user) {
    return user.toString();
}

User类的定义如下:

@ToString
@NoArgsConstructor
@Data
public class User {
    private String username;
    private String password;
    private Detail detail;

    @Data
    @NoArgsConstructor
    public class Detail {
        private String gender;
        private String location;
    }
}

发送请求时,我收到错误:

  

无效的属性'详细[性别]'豆类   [com.example.demo.param.User]:非法获取财产的企图   '细节'抛出异常;嵌套异常是   org.springframework.beans.NullValueInNestedPathException:无效   财产'详细' bean类[com.example.demo.param.User]:可以   不实例化属性类型[com.example.demo.param.User $ Detail]   自动增长嵌套属性路径;嵌套异常是   java.lang.NoSuchMethodException:   com.example.demo.param.User $详细。()

请求数据可以在Chrome开发工具中找到:

username: aaa
password: bbb
detail[gender]: ccc
detail[location]: ddd

似乎细节[性别]和细节[位置]无法被识别为细节的子属性

当我使用注释@RequestBody接收内容类型的请求时,它运行良好:application / json。

但是如何在上面的这种情况下将请求参数作为User对象获取?

1 个答案:

答案 0 :(得分:0)

使用您的对象结构,请求将适用于这两种情况(选项1更好):

选项1:

username: aaa
password: bbb
detail.gender: ccc
detail.location: ddd
  • 必须通过'dot'

  • 访问嵌套表单数据
  • 必须按如下方式传递请求以使用Detail对象: (请注意,对象的变量以detail.gender而不是detail[gender]) <进行访问/强>

选项2:

  • 将您的详细信息设为地图而非复杂对象,以便详细[性别]映射到关键值“性别”