簡體   English   中英

無法刪除CrudRepository中的所有條目

[英]Cannot delete all the entries from a CrudRepository

基於https://spring.io/guides/gs/accessing-data-rest/中的教程,我使用“ CrudRepository”和“ RepositoryRestResource”來制作地址簿。 它適用於所有服務,例如添加新聯系人,刪除聯系人等。但是,我的問題是從地址簿中刪除所有聯系人(存儲庫條目)。 更具體地說,當我想通過以下方式將其全部刪除時:

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

我收到以下錯誤:

{“時間戳”:1518158144204,“狀態”:404,“錯誤”:“未找到”,“消息”:“無消息”,“路徑”:“ / 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則不可用。

此處參考文檔。

您可以通過傳遞帶有項目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請求即可獲得數據。

以我的經驗,最好編寫一個可以處理id而不是實體的delete函數,因為有時即使刪除實體,它們也不會被后台進程刪除。

在您的存儲庫中,您可以編寫類似

@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所說的是正確的,您不應該使用rest調用直接調用存儲庫。 其余的調用應該轉到控制器,然后控制器可以對存儲庫執行操作以執行刪除操作。

//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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM