基于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/