使用spring/java使用派生类设计和实现RESTful URI
让我们假设我们有水果作为基类,苹果和香蕉作为派生子类。 我想知道,哪些URI约定和实现最有意义。这是直截了当的:使用spring/java使用派生类设计和实现RESTful URI,java,spring,rest,spring-mvc,spring-roo,Java,Spring,Rest,Spring Mvc,Spring Roo,让我们假设我们有水果作为基类,苹果和香蕉作为派生子类。 我想知道,哪些URI约定和实现最有意义。这是直截了当的: GET /fruits - returns list of all fruits GET /bananas - returns list of all bananas GET /apples - returns list of all apples GET /bananas/new - returns form for creating a new banana 现在,由于Spri
GET /fruits - returns list of all fruits
GET /bananas - returns list of all bananas
GET /apples - returns list of all apples
GET /bananas/new - returns form for creating a new banana
现在,由于Spring已经处理了新对象的创建和所有参数的设置,保存对象的方法归结为:
fruit.persist(); // same for bananas and apples
那么,您将如何设计URL:
POST /fruits - creates a new fruit // as generic URI ... OR
POST /bananas - creates a new banana // same for apples
通用方法的问题似乎是,该方法会将香蕉/苹果保存为水果,而不是香蕉/苹果:
@RequestMapping(value = "/", method = RequestMethod.POST)
private String saveFruit(@Valid Fruit fruit, Long basketId) {
Basket basket = Basket.findBasket(basketId);
fruit.setBasket(basket);
fruit.persist();
}
我不知道如何告诉spring应该创建子类,尽管我在create表单中设置了正确的子类(例如,在调用GET/bananas/new时):
因此,目前我创建了两种保存苹果和香蕉的公共方法
POST /bananas - create a banana
POST /apples - create an apple
实施方式如下:
@RequestMapping(value = "/", method = RequestMethod.POST)
public String saveBanana(@Valid Banana fruit) {
String basketId = this.saveFruit(fruit);
return "redirect:/basket/edit/" + basketId;
}
不知何故,这并不能满足我保持事物干爽和简单的需要。
也因为在编辑水果时,我想称之为
GET /fruits/123/edit - return the edit form of a fruit
然后,应该显示哪些表单字段的逻辑由视图处理
您还可以考虑调用子类控制器,例如/banana/123/edit,这样可以进一步解耦代码,并且在添加新的水果时不需要更改文件。您认为什么是最佳解决方案?非常重要的是,不要让您的框架支配您的资源设计。HTTP对基类或子类一无所知,只知道资源。忘记Spring框架,您的资源设计从HTTP/ReSt的角度想获得什么
如果您倾向于/fruits/{id}
的唯一原因是为了避免在后端重复,那么您的设计是由内部问题驱动的,而不是外部问题
如果您的banana
资源在格式化为JSON时与apple
资源具有不同的表示形式(例如新的布局、不同的属性等),那么,IMHO,它可能应该使用自己的资源来处理
一旦你做出了这个决定,那么看看如何使用Spring尽可能干净地完成它。Pete,谢谢你的建议。我刚开始用这种方式实现它。每当我有具有相同逻辑的部件时,我现在就使用基类控制器的静态方法(以保持干燥)。
GET /fruits/123/edit - return the edit form of a fruit