【问题标题】:Problems with the REST APIREST API 的问题
【发布时间】: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


    【解决方案1】:

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

    @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();
    
        }
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 2017-10-17
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多