java - 无法删除 CrudRepository 中的所有条目

标签 java spring rest spring-data

基于https://spring.io/guides/gs/accessing-data-rest/中的教程,我使用“CrudRepository”和“RepositoryRestResource”来制作通讯录。它适用于所有服务,例如添加新联系人、删除联系人等。 但是,我的问题是从地址簿中删除所有联系人(存储库的条目)。 更具体地说,当我想通过以下方式删除它们时:

$curl -X 删除 http://localhost:8080/api/contact/

我收到以下错误:

{"timestamp":1518158144204,"status":404,"error":"Not Found","message":"No message available","path":"/api/contact/"}.

请注意,spring.data.rest.basePath=/api 已添加到 application.properties。

PersonRepository.java:

package hello;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "contact", path = "contact")
public interface PersonRepository extends CrudRepository<Person,String>{
}

Person.java:

package hello;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;

private String firstname;
private String familyname;
private String phonenumber;
private String email;

public String getfirstname() {
    return firstname;
}

public void setfirstname(String firstName) {
    this.firstname = firstName;
}

public String getfamilyname() {
    return familyname;
}

public void setfamilyname(String familyName) {
    this.familyname = familyName;
}

public String getphonenumber() {
    return phonenumber;
}

public void setphonenumber(String phoneNumber) {
    this.phonenumber = phoneNumber;
}

public String getemail() {
    return email;
}

public void setemail(String Email) {
    this.email = Email;
}


}

最佳答案

Spring REST 存储库具有针对集合资源单个项目资源公开的不同方法。更具体地说,对于集合资源,GET、HEAD 和 POST 是开箱即用的,但 DELETE 则不然。

引用文档 here

您可以通过传递带有项目 ID 的 DELETE 请求来删除单个项目,就像您遵循的指南所述,例如 curl -X DELETE http://localhost:8080/api/contact/23 .

恕我直言,出于安全原因,我认为这样做是正确的。想象一下,如果有人在删除单个资源时碰巧没有传递项目 ID,则可能会意外删除您的整个集合。

如果您想要/需要,您可以编写自己的自定义 deleteAll 方法,但要小心。

您可以编写自定义删除方法,例如:

public void deleteAllContacts();

您可以通过简单的 GET 请求访问该方法: http://localhost:8080/api/contact/search/deleteAllContacts

现在我必须提到,这并不是真正的 REST 原则,发出 GET 请求并删除资源,而这个 /search/delete... 部分确实如此之所以突出,是因为它有点让 APi 用户感到困惑。它会搜索、删除还是什么?

这是做你想做的事情的一种方式,但是我真的不推荐这种方式,因为它不是一种优雅的做事方式,而且并不真正遵循良好的原则编程原理。

也许您应该考虑拥有一个 ContactController,如果用户传递 token 或其他一些必需的参数,它允许此功能,因为您不想将您的 API 暴露给每个 google chrome 的摆布在那里,仅仅通过一个 http 请求就可能删除所有数据。

关于java - 无法删除 CrudRepository 中的所有条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714561/

相关文章:

java - 如何在 ContentProvider 中传递 Rawquery?

java - 无法打开嵌套条目“WEB-INF/lib/example.jar”

java - Spring MVC 和 @RequestParam 与 x-www-form-urlencoded

java - 使用 OutputStream (android) 通过 SFTP 从远程服务器下载文件

java - 如何在 Java 中使用 wkhtmlpdf 将 HTML 文件转换为 PDF

java - 如何向组件显示图像?

java - Spring v3 找不到元素 'mvc:resources' 的声明

java - 有没有办法从属性文件值设置其余配置 header ?

javascript - 如何为本地文件创建服务器 URL 以在前端提供下载?

rest - 超媒体 API : How to document properly?