繁体   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