无法删除CrudRepository中的所有条目

时间:2018-02-09 21:47:01

标签: java spring rest spring-data

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

$curl -X DELETE http://localhost:8080/api/contact/

我收到以下错误:

  

{" timestamp":1518158144204," status":404," error":" Not Found"," message& #34;:"没有可用消息","路径":" / 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;
}


}

3 个答案:

答案 0 :(得分:0)

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允许此功能,因为您不希望将API暴露给每个Google Chrome的怜悯只需一个http请求就可以将所有数据清除掉。

答案 1 :(得分:0)

根据我的经验,最好编写一个删除函数,该函数使用id而不是实体,因为有时即使删除实体,它们也不会被删除,直到后台进程执行。

在您的存储库中,您可以编写类似

的内容
@Modifying
@Transactional
@Query("DELETE FROM Person p WHERE p.id = ?1)
void delete(Integer id);

@Modifying
@Transactional
@Query("DELETE FROM Person p WHERE p.id in ?1)
void delete(Set<Integer> ids);

第一个允许您通过id删除单个实体,而第二个允许您通过ID删除一个实体。

Urosh T说的是真的,你不应该使用你的其余调用来直接调用存储库。其余的调用应该转到控制器,然后控制器可以在存储库上执行删除操作。

答案 2 :(得分:0)

//You can use JPA Repository if you have no problem with it
//For Deleting all entities managed by the userRepository
@DeleteMapping("/users")
public void deleteAllUsers() {

     userRepository.deleteAll();
}


import com.my.package.model.UserModel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<UserModel, Long> 
{

}

 //You are welcome to ask where you don't understand.