根据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;
}
}
答案 0 :(得分:0)
Spring REST存储库具有针对集合资源和单个项目资源公开的不同方法。更具体地说,GET,HEAD和POST是开箱即用的集合资源,但DELETE不是。
参考文档here。
您可以通过传递带项目ID的DELETE请求来删除单个项目,就像您所关注的指南所示,例如curl -X DELETE http://localhost:8080/api/contact/23
。
如果您需要/需要,可以编写自己的自定义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.