当前位置: 首页 > 知识库问答 >
问题:

删除Spring数据REST HATEOAS中REST上的关联

马梓
2023-03-14

我想知道如何通过REST调用删除多对多关联。我能够创建记录并将其关联,但不知道如何删除。

我有一个SpringBoot项目,在这个项目中,我使用REST和HATEOAS绕过服务和控制器,并直接公开我的存储库。

我有一个用户模型/域类

@Entity
@Table(name = "usr")
public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Version
private long version = 0;

@Id
@GeneratedValue(generator="optimized-sequence")
private Long id;

@Column(nullable = false, unique = true, length = 500)
@Size(max = 500)
private String userName;

@Column(nullable = false, length = 500)
@Size(max = 500)
private String firstName;

@Column(nullable = false, length = 500)
@Size(max = 500)
private String lastName;

@ManyToMany(    fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable( name="user_role",
            joinColumns={ @JoinColumn(  name = "user_id", 
                                        nullable = false
                                    ) 
                        }, 
            inverseJoinColumns={ @JoinColumn(   name="role_id", 
                                                nullable=false
                                            ) 
                                }
)
private Set<Role> roles = new HashSet<Role>(0);

...Getters/Setters Below...

如您所见,我有一个roles成员,它与Role类有多对多的关联,其代码如下:

@Entity
public class Role {

@Id
@GeneratedValue(generator="optimized-sequence")
private Long id;

@Column(nullable = false)
private String name;

@Column(nullable = false)
private String description;

...Getters/Setters Below...

我的仓库看起来是这样的:

用户库

public interface UserRepository extends 
        JpaRepository<User, Long>, JpaSpecificationExecutor<User> {

    List<User> findByUserName(String username);

}

角色还原

public interface RoleRepository 
        extends JpaRepository<Role, Long> {

}

现在一切都好了。当我从浏览器访问项目根目录时,我会得到JSON HAL格式的存储库索引/目录。精彩的

(注意,我正在从下面的测试中删除超文本传输协议://部分,因为StackOverflow将其计入我的链接配额)

我,使用WizTools REST Client,HTTP. POST到角色(localhost:8080/resttest/roles)存储库并创建一个新的角色。成功,角色ID#4创建。

然后我发布到用户存储库以创建一个用户(localhost:8080/restest/users)。成功,用户ID#7已创建。

然后,我将其放入User存储库,以创建与角色的关联:

PUT localhost:8080/resttest/users/7/roles
Content-type: uri-list
Body: localhost:8080/resttest/roles/4

伟大的结社。用户9现在与角色4关联。

现在我一辈子都不知道如何删除这个关联。

我使用与上面相同的命令发送HTTP DELETE而不是PUT。

DELETE localhost:8080/resttest/users/7/roles
Content-type: uri-list
Body: localhost:8080/resttest/roles/4

返回:不允许使用HTTP/1.1405方法

{
    "timestamp":1424827169981,
    "status":405,
    "error":"Method Not  Allowed",
    "exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
    "message":"Request method 'POST' not supported"
}

共有2个答案

景唯
2023-03-14

从文档中:

删去

...

405方法不允许-如果关联是非可选的

PUT表示替换整个角色集。因此,要删除一个链接,请放置所有剩余链接。如果您只有一个链接,并且希望将其删除,您将放入一个空集合:

PUT localhost:8080/resttest/users/7/roles
Content-type: uri-list
Body:

BTW:您不会发送带有DELETE请求的正文。这没有意义。

编辑

另请参阅Spring HATEOAS开发者的回答。

潘皓
2023-03-14

尽管使用剩余元素创建一个PUT请求可以做到这一点,DELETE是一个可接受的删除关联资源的命令,在大多数情况下更易于使用。

就你的例子而言,这应该是可行的:

DELETE localhost:8080/resttest/users/7/roles/4

另一方面,在创建关联时,预期负载中会有URI。您不需要在正文中写入整个URL,这就足够了:

PUT localhost:8080/resttest/users/7/roles
Content-type: uri-list
Body: /roles/4

希望这有帮助。

 类似资料:
  • 我们需要改变这种反应: 到_链接上的唯一“自我”部分:

  • 由于我的域类中存在不明确的关联,新添加的正在引发。 链接数组如下所示:

  • 我在Spring Boot中遇到了一个多对多关系问题。代码如下: 和 当然,我有表,在其中,在任务中插入标签并保存该任务后,会出现一个条目。但是,当我删除标签(或清除它们)时,条目不会从连接表中删除。这是测试: task\u tag表确实在这两列(并且仅在这两列)上形成了一个复合索引。 我做错了什么?我遵循了每一条建议和建议——使用集合代替列表,使用助手方法,清理等等。。。我找不到窃听器。 非常感

  • 在使用@RepositoryRestResource将域对象导出到Rest时,如何在Java中创建Neo4j关系?

  • 概述 使用remove()方法从集合中删除文档。这个方法需要一个条件文档用来决定哪些文档将被删除。 删除匹配的所有文档 下面的操作将删除指定条件匹配的所有文件: db.restaurants.remove( { "borough": "Manhattan" } ) 删除操作返回一个WriteResult对象,它包含了操作的状态信息。nRemoved字段值表示被删除的文档数量。 使用justOne可

  • 删除数据Delete方法,参数为struct的指针并且成为查询条件。 user := new(User) affected, err := engine.Id(id).Delete(user) Delete的返回值第一个参数为删除的记录数,第二个参数为错误。 注意:当删除时,如果user中包含有bool,float64或者float32类型,有可能会使删除失败。具体请查看 FAQ