Spring MVC:当请求内容类型为 x-www-form-urlencoded 时绑定嵌套的请求参数



request param:

{
"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;
}
}

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

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

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

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

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

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

但是在上述情况下,我如何将请求参数作为用户对象获取?

使用您的对象结构,请求将在以下 2 种情况下工作(选项 1 更好):

选项 1 :

username: aaa
password: bbb
detail.gender: ccc
detail.location: ddd
  • 嵌套表单数据必须通过"点"访问

  • 必须按如下方式传递请求才能使用 Detail 对象:(请注意,对象的变量作为detail.gender而不是detail[gender])

选项 2 :

  • 将详细信息设置为映射而不是复杂对象,以便详细信息[gender]映射到键值"gender">

最新更新