[英]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.