为什么我不能使用单一方法在 POST 请求中添加单个用户或用户列表?

问题描述 投票:0回答:1

我正在学习一些关于 Spring Boot 中的 Rest Controller 的知识,我真的是一个初学者,我在这里做了一些测试,这个问题就出现了。第一个选项返回错误 500。在研究时,我发现尝试直接映射到 Object 可能会导致问题,因为 Spring Boot 在 JSON 反序列化期间无法推断出确切的类型。我只是想多了解一点

// Save a list of users or a single user
    @PostMapping()
    public void save(@RequestBody Object request){
        if(request instanceof List<?>){
            List<?> users = (List<?>) request;
            // It will iterate through each object in the list to add the user
            for(Object obj : users){
                repository.save((User) obj);
            }
        }
        else if (request instanceof Usuario){
            repository.save((User) request);
        }
    }

推荐

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserRepository repository;

    // Method to save a single user
    @PostMapping
    public void saveOne(@RequestBody User user) {
        repository.save(user);
    }

    // Method to save a list of users
    @PostMapping("/list")
    public void saveAll(@RequestBody List<User> users) {
        for (User user : users) {
            repository.save(user);
        }
    }

// rest of the code...

}

在存储库层:

@Repository
public class UserRepository {

    private List<User> users = new ArrayList<>();

    public UsuarioRepository() {
        users.add(new User("jonh","password"));
        users.add(new User("frank","masterpass"));
    }
    public void save(User user){
        System.out.println("SAVE - Receiving the user at the repository layer");
        System.out.println(user);
        user.add(user);
    }

// rest of the code...
}

我完全愿意接受纠正和建议。

我尝试制作一种方法,可以将单个用户添加到列表或一次将多个用户添加到列表中。但它不起作用,我想更多地了解原因。

java json spring serialization http-post
1个回答
0
投票

控制器接收一个字符串,因此它无法自动知道如何处理它。

我会避免让端点根据请求正文的类型以不同的方式表现,但如果您愿意,您可以通过 parametersheaders 来实现。

带参数:

@PostMapping(value = "/users", params = "list=false")
public ResponseEntity<?> handleUser(@RequestBody User request) {
    repository.save(user);
}

@PostMapping(value = "/users", params = "list=true")
public ResponseEntity<?> handleUserList(@RequestBody List<User> request) {
    for (User user : users) {
        repository.save(user);
    }
}

或带有标题:

@PostMapping(value = "/users", headers = "X-List=false")
public ResponseEntity<?> handleUser(@RequestBody User request) {
    repository.save(user);
}

@PostMapping(value = "/users", headers = "X-List=true")
public ResponseEntity<?> handleUserList(@RequestBody List<User> request) {
    for (User user : users) {
        repository.save(user);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.