【发布时间】:2020-08-17 07:23:24
【问题描述】:
在创建我的 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 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 和任务创建控制器?这也是问题之一。如果我们更深入地完成任务,那么这里的一切都很糟糕。我的任务控制器应该是这样的?
@RestController
@RequestMapping("users/{userId}/taskcards/{cardId}/tasks")
public class TaskController {
// get, post, update, delete methods
}
有些东西告诉我不。如果我必须让用户和任务卡来请求任务,这将是可怕的。在这种情况下我该怎么办?如何正确设计我的 rest API?
【问题讨论】:
标签: java spring rest architecture