Problems with the REST API



在创建rest应用程序时,遇到了一个大问题。它在于元素的嵌套,以及我对如何通过rest控制器正确地赋予它们的误解。我有如下结构:

public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
@JsonManagedReference
private List<TaskCard> taskCards;
}
public class TaskCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "taskCard", fetch = FetchType.LAZY)
@JsonManagedReference
private List<Task> tasks;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
@JsonBackReference
private User user;
}
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;  
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "task_card_id")
@JsonBackReference
private TaskCard taskCard;
}

所有这些类都是实体。正如您可能已经猜到的,我为这些类中的每一个都有一个rest控制器。这就是问题的开始。在我的脑海中,我的rest api的结构应该是这样的:/users/1/taskkards/1/tasks/1/。它看起来很复杂,对吧?确切地当我试图只获取用户时,原则上没有问题,我可以发送一个/users请求,我的用户休息控制器将处理该请求。但如果我们深入到任务卡,那么问题就已经存在了。事实证明,我的TaskCardController应该是这样的:

@RestController
@RequestMapping("users/{userId}/taskcards")
public class TaskCardController {
// get, post, update, delete methods
}

这已经意味着我还必须将用户信息转移到这里,以确保任务卡属于他。但同时,因为我的用户有一个任务卡字段,我可以从哪里获得这个值?我需要去存储库并在数据库中查找它,还是只做类似的事情?

@GetMapping
public List<TaskCard> getAllTaskCards(@PathVariable("userId") User user) {
return user.getTaskCards();
}

出现这样的嵌套是否正常?如果我可以从用户那里获得,为什么我需要为taskCard和task创建控制器?这也是问题之一。如果我们更深入地研究这项任务,那么这里的一切都很糟糕。我的任务控制器应该是这样的吗?

@RestController
@RequestMapping("users/{userId}/taskcards/{cardId}/tasks")
public class TaskController {
// get, post, update, delete methods
}

有些事情告诉我不会。如果我必须让用户和任务卡来请求任务,这将是可怕的。在这种情况下我该怎么办?如何正确设计我的其余API?

对于Task和TaskCard控制器,只需从客户端发送JSON,然后从数据库中获取相应的User。例如,

@RestController
@RequestMapping("/taskcards")
public class TaskCardController {
@Autowired
private UserRepo userRepo; // supposing you are using Spring Data repositories

@PostMapping("/addTaskCard")
public ResponseEntity addTaskCard(@RequestBody TaskCard newTaskCard){
User user = userRepo.getUserById(newTaskCard.getUser().getId());
user.getTaskCards().add(newTaskCard);
userRepo.save(user);
return ResponseEntity.ok().build();
}
}

您可以继续使用此方法。从客户端发送足够的数据,然后在后端进行查询,并从数据库中获取其他相关实体。

最新更新