我正在学习一些关于 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...
}
我完全愿意接受纠正和建议。
我尝试制作一种方法,可以将单个用户添加到列表或一次将多个用户添加到列表中。但它不起作用,我想更多地了解原因。
控制器接收一个字符串,因此它无法自动知道如何处理它。
我会避免让端点根据请求正文的类型以不同的方式表现,但如果您愿意,您可以通过 parameters 或 headers 来实现。
带参数:
@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);
}
}