2015-02-23 26 views
2

我正在使用Spring Data REST。我正尝试从实体(项目)中解除集合关联。即 - 项目的属性是List类型。我想从该List删除所有项目。为什么在Spring Data REST中DELETE不支持多对多关联资源?

要做到这一点,我使用DELETE方法:

curl -X DELETE …/categories/54ea0bcf27a2fb1b4641083a/fixedParentCategories 

这给了我405 Method not allowed错误代码。但是,它适用于单值协会(当它不是List类型时)。 documentation明确列出DELETE作为关联支持的方法。我想知道是否有解决方法。另外,我尝试使用PUT(Content-Type:text/uri-list),它有一个空的主体,它给出关于缺少请求主体的错误。这种关联的其他操作都工作正常 - 我可以将项目添加到这个集合,等

我的实体是这样的:

@Document 
public class Category { 

    @DBRef(lazy = true) 
    private List<Category> fixedParentCategories; 
    … 
} 
+0

该文档还指出405是非可选的关联返回的。你的域模型是什么样的? – 2015-02-24 07:55:27

+0

@Document \t @Description( “类别”) \t公共类分类{\t \t \t \t @Description( “固定父类”) \t \t @DBRef(懒惰=真) \t \t私有列表 fixedParentCategories ; \t \t} – 2015-02-24 11:01:55

+0

将域对象添加到原始文章 – 2015-02-24 11:10:17

回答

3

我刚才检查的代码,你是正确的,我们正在积极拒绝DELETE请求Map s和收藏。基本原理如下:

在域模型中,Map或集合的关联不得为null。将其转换为HTTP资源意味着资源将始终可用,并在最糟糕的情况下返回空表示(空JSON数组或空JSON对象)。接受DELETE请求将逻辑上在领域模型中的关系,从而导致与第一个假设相矛盾的状态。

我们通常建议简单地将一个空媒体类型为text/uri-list的空体放入关联资源以清空关联,因为这在语义上更加正确。考虑它像截断和删除数据库表之间的区别。

如果你认为这应该改变,并有很好的理由,你可以支持你的请求,随时打开我们的JIRA门票。

+1

谢谢你看看它。事实上,我完全理解了基本原理,因此,我尝试使用带有空体的PUT(Content-Type:text/uri-list),并给出关于缺少请求主体的错误。 (这在我原来的帖子中提到过)。 – 2015-02-26 08:19:07

+0

我已经添加了[测试用例](https://github.com/spring-projects/spring-data-rest/commit/8b3b7bac98e155b68ff896aea359f060d0aee797#diff-1be08248c5e5c2b67ff975b9e91e57b9R221),显示对项目资源的“PUT”不会擦除关联并且向媒体类型为“text/uri-list”的关联资源“PUT”一个空的“String”来清除关联。 – 2015-02-26 11:00:41

+1

谢谢。测试用例很好。但是,仍然通过HTTP访问时,我仍然得到相同的回应: - \t {“cause”:null,“message”:“缺少所需的请求主体内容:”} 看起来问题在于spring-webmvc项目代码。 \t org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodP rocessor.readWithMessageConverters()。 这里有一个空有效负载的检查,并抛出这个异常。 通过在有效负载中发送“空格”字符来绕过此问题。不过,这是一个问题。 – 2015-03-02 03:57:50