@RequestBody 嵌套数组的值为null
时间: 2023-11-04 17:30:35 浏览: 116
如果你在使用 Spring Boot 中的 @RequestBody 注解时,发现嵌套的数组值为 null,可能是因为你的 JSON 数据格式不正确。
首先,确保你发送的 JSON 数据格式正确。可以使用 Postman 等工具来测试你的请求,确保请求体中的 JSON 数据符合你的预期格式。
其次,检查你的后端代码,确保你的实体类中的属性与 JSON 数据格式匹配。如果你的实体类中的属性是一个嵌套的数组类型,那么它应该对应一个数组类型的 JSON 数据。
最后,如果你的 JSON 数据格式正确,实体类中的属性也正确,但是嵌套的数组值仍然为 null,那么你可以尝试在数组类型的属性上添加 @JsonDeserialize 注解,指定一个自定义的反序列化器来解决该问题。
相关问题
怎么使用@Validated校验请求获得的数组中的每一个对象的属性的有效性
在 Spring Boot 中,我们可以使用 @Validated 注解和 Bean Validation 的注解来校验请求参数的有效性,包括数组中每一个对象的属性。下面是一个示例代码:
首先,我们需要在 Controller 中使用 @Validated 注解来启用参数校验:
```java
@RestController
@RequestMapping("/example")
@Validated
public class ExampleController {
// ...
}
```
然后,我们可以在 Controller 的方法中使用 @RequestBody 注解和 Bean Validation 的注解来校验请求参数的有效性,如下所示:
```java
@PostMapping("/array")
public ResponseEntity<?> handleArrayRequest(@RequestBody @Validated ExampleRequest[] requests) {
// ...
}
```
在上面的示例中,我们使用 @RequestBody 注解来将请求体转换为 ExampleRequest 类型的数组,然后使用 @Validated 注解和 ExampleRequest 类中的注解来校验每一个对象的属性的有效性。如果请求中的某个对象的属性无效,校验框架会抛出 ConstraintViolationException 异常,我们可以在异常处理器中对其进行处理。
需要注意的是,@Validated 注解只能用于方法参数上,不能用于类上。同时,如果我们要校验嵌套的对象,需要在嵌套对象的属性上添加相应的 Bean Validation 注解,比如 @NotNull、@Size 等。
前端传来的数据,有level,content,child,index四个属性,是分级别的,数组里嵌套多个对象,对象的child属性有嵌套多个数组,以此类推,后端springboot框架怎么接收并存储到数据库中,请用代码实现增删查操作
假设前端传来的数据结构如下:
```javascript
[
{
level: 0,
content: 'Level 0 content',
child: [
{
level: 1,
content: 'Level 1 content',
child: [
{
level: 2,
content: 'Level 2 content',
child: [],
index: 0
}
],
index: 0
},
{
level: 1,
content: 'Level 1 content',
child: [
{
level: 2,
content: 'Level 2 content',
child: [],
index: 0
},
{
level: 2,
content: 'Level 2 content',
child: [],
index: 1
}
],
index: 1
}
],
index: 0
},
{
level: 0,
content: 'Level 0 content',
child: [],
index: 1
}
]
```
首先,我们需要定义数据库表的结构,假设我们将每个对象存储在一个名为 `tree_node` 的表中,表结构如下:
```sql
CREATE TABLE tree_node (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
level INT NOT NULL,
content TEXT NOT NULL,
parent_id BIGINT UNSIGNED DEFAULT NULL,
index_in_parent INT NOT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_tree_node_parent FOREIGN KEY (parent_id) REFERENCES tree_node(id) ON DELETE CASCADE
);
```
其中,`id` 是自增主键,`level` 表示节点的层级,`content` 存储节点的内容,`parent_id` 表示父节点的 `id`,`index_in_parent` 表示节点在父节点中的顺序。
接下来,我们可以通过 `@RequestBody` 注解将前端传来的数据转换成一个 `List`,然后通过 `JpaRepository` 进行增删查操作。假设我们将新增操作放在 `TreeNodeController` 中,代码如下:
```java
@RestController
@RequestMapping("/treeNode")
public class TreeNodeController {
@Autowired
private TreeNodeRepository treeNodeRepository;
@PostMapping("/")
public String addTreeNode(@RequestBody List<TreeNode> treeNodes) {
for (TreeNode treeNode : treeNodes) {
saveTreeNode(treeNode, null);
}
return "success";
}
private void saveTreeNode(TreeNode treeNode, Long parentId) {
TreeNode savedNode = new TreeNode();
savedNode.setLevel(treeNode.getLevel());
savedNode.setContent(treeNode.getContent());
savedNode.setParentId(parentId);
savedNode.setIndexInParent(treeNode.getIndex());
savedNode = treeNodeRepository.save(savedNode);
for (TreeNode childNode : treeNode.getChild()) {
saveTreeNode(childNode, savedNode.getId());
}
}
@DeleteMapping("/{id}")
public String deleteTreeNode(@PathVariable Long id) {
treeNodeRepository.deleteById(id);
return "success";
}
@GetMapping("/")
public List<TreeNode> getAllTreeNodes() {
return treeNodeRepository.findAll();
}
@GetMapping("/{id}")
public TreeNode getTreeNodeById(@PathVariable Long id) {
return treeNodeRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
}
}
```
其中,`TreeNodeRepository` 是一个继承自 `JpaRepository` 的接口,用于对 `tree_node` 表进行操作。`addTreeNode` 方法将前端传来的数据转换成 `TreeNode` 对象,并通过递归方式将每个节点存储到数据库中。`deleteTreeNode` 方法根据 `id` 删除节点,`getAllTreeNodes` 方法返回所有节点,`getTreeNodeById` 方法返回指定 `id` 的节点。
以上代码仅供参考,具体实现可能需要根据实际情况进行调整。
阅读全文