如果你正在设计一个图书馆应用程序,让公民借书和归还书籍,你会如何从数据库的角度设计它。
我这样做了,我创建了一个书籍类
@Entity
public class Book {
private Integer id;
private String title;
private Integer numberOfCopies;
以及当用户向公民/借用/{id} 发出请求时(使用书籍 ID 的 numberOfCopies 变量向上或向下添加一个
@GetMapping(path = "citizen/borrow/{id}", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public Book borrowBook(@PathVariable Integer id) {
Book book = bookRepo.findById(id).orElseThrow(() -> new BookNotFoundException(id));
Integer numberOfCopies = book.getNumberOfCopies();
if (numberOfCopies == 0) throw new BookNotAvailableException();
book.setNumberOfCopies(numberOfCopies - 1);
bookRepo.save(book);
return book;
}
您将如何实现这样的应用程序?这是好的编程风格还是你的想法?
首先,根据 REST 实践,终结点(或资源(应该是自描述的。
这条路看起来citizen/borrow/{id}
像是在借公民,而不是书。像这样制作资源会更有意义:/v1/book/{id}/borrow
作为 POST 请求,因为将执行修改查询。
其次,将可重用逻辑移动到
@Service
层。
我有一个规则,永远不要将存储库注入控制器。所有保存和更新都应在服务层中处理,并返回 DTO(数据传输对象(。
第三,在控制器层处理您的输入。
您的@PathVariable
可能为空。这可能会导致代码中出现更深层次的问题。为什么不立即处理它并从一开始就抛出异常呢?
if (id == null)
throw new new BookNotFoundException();