Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用spring/java使用派生类设计和实现RESTful URI_Java_Spring_Rest_Spring Mvc_Spring Roo - Fatal编程技术网

使用spring/java使用派生类设计和实现RESTful 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

让我们假设我们有水果作为基类,苹果和香蕉作为派生子类。 我想知道,哪些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
现在,由于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