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

@RepositoryRestResource中m对n关系的处理

魏书
2023-03-14
public void setUsers(Set<AppUser> users) {
    users.forEach(u -> u.getGroups().add(this));
    this.users = users;
}

这样我就可以

POST http://localhost:8080/groups

{
  "name": "Group X",
  "users": ["http://localhost:8080/users/1"]
}

但我的问题是,这对我来说并不合适--它看起来确实像是一种变通方法,而不是真正的Spring方式来实现这个需求。所以..

我目前正在努力使用Spring的@repositoryrestresource创建关系资源。我想创建一个新组,并将其与调用用户关联,如下所示:

POST http://localhost:8080/users/1/groups

{
  "name": "Group X"
}

但是唯一的结果是响应204没有内容。我不知道为什么。这可能与我的另一个问题有关,也可能与我的另一个问题无关(请参见此处),我试图通过在JSON有效负载中设置相关资源来实现同样的问题--但这也不起作用。

服务器端我得到以下错误:

tion$ResourceSupportHttpMessageConverter : Failed to evaluate Jackson deserialization for type [[simple type, class org.springframework.hateoas.Resources<java.lang.Object>]]: java.lang.NullPointerException

请让我知道,如果你需要任何具体的代码。

@RepositoryRestResource(collectionResourceRel = "groups", path = "groups", exported = false)
public interface UserGroupRepository extends JpaRepository<UserGroup, Long> {
    List<UserGroup> findByName(@Param("name") String name);
}
PATCH http://localhost:8080/users/1

{
  "groups": [
    {
      "name": "Group X"
    }
  ]
}
@Autowired
private TestRestTemplate template;

private static String USERS_ENDPOINT = "http://localhost:8080/users/";
private static String GROUPS_ENDPOINT = "http://localhost:8080/groups/";

// ..

@Test
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
public void whenCreateUserGroup() {

    // Creates a user
    whenCreateAppUser();

    ResponseEntity<AppUser> appUserResponse = template.getForEntity(USERS_ENDPOINT + "1/", AppUser.class);
    AppUser appUser = appUserResponse.getBody();

    UserGroup userGroup = new UserGroup();
    userGroup.setName("Test Group");
    userGroup.setUsers(Collections.singleton(appUser));

    template.postForEntity(GROUPS_ENDPOINT, userGroup, UserGroup.class);

    ResponseEntity<UserGroup> userGroupResponse = template.getForEntity(GROUPS_ENDPOINT + "2/", UserGroup.class);

    Predicate<String> username = other -> appUser.getUsername().equals(other);

    assertNotNull("Response must not be null.", userGroupResponse.getBody());

    assertTrue("User was not associated with the group he created.",
            userGroupResponse.getBody().getUsers().stream()
                    .map(AppUser::getUsername).anyMatch(username));
}
userGroup.setUsers(Collections.singleton(appUser)); 

将中断此测试并返回404错误请求

共有1个答案

濮宇定
2023-03-14

根据SDR参考:

邮政

仅支持集合关联。向集合中添加新元素。支持的媒体类型:

POST http://localhost:8080/users/1/groups (with Content-Type:text/uri-list)
http://localhost:8080/groups/1
 类似资料:
  • 问题内容: 让我们看一个例子-书。一本书可以有1..n位作者。作者可以拥有1..m本书。代表一本书的所有作者的一种好方法是什么? 我想到了一个创建Books表和Authors表的想法。Authors表具有一个主要AuthorID密钥,即作者的姓名。图书表具有主要的图书ID和有关图书的元数据(书名,出版日期等)。但是,需要一种将书籍链接到作者以及将作者链接到书籍的方法。这就是问题所在。 假设我们有三

  • 描述 (Description) 占有量词[X{n,m}+]匹配存在至少n但不超过m次的X. 例子 (Example) 以下示例显示了possesive量词的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PossesiveQuantifi

  • 描述 (Description) 不情愿量词[X{n,m}?]匹配存在至少n但不多于m次的X. 例子 (Example) 以下示例显示了不情愿量词的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ReluctantQuantifierDem

  • 描述 (Description) 贪心量词[X{n,m}]匹配至少为n但不超过m次的X. 例子 (Example) 以下示例显示了贪婪量词的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class GreedyQuantifierDemo {

  • 我想要一个数据结构来支持这些特定的1: N关系:- 1#。提高0-N 2#。有0-N 3#。培育0-N 4#。是0-N的房子。 注: -这些关系中的状态都是暂时的,例如可能会提升,但一年后,可能会放弃 -所有对象都继承自,并且具有唯一的int-ID。 在所有上述关系中,我希望能够支持这些功能:- F1。添加关系,例如

  • 我明天有一个计算机科学期中考试,我需要帮助确定一个特定递归函数的复杂性,如下所示,这比我已经研究过的东西要复杂得多:它有两个变量 T(n)=3 mT(n-m) 在m为常数的简单情况下,可以通过编写解包关系轻松获得公式;然而,在这种情况下,拆包并不会使生活变得更容易,如下所示(假设t(0)=c): T(n)=3 mT(n-m) T(n-1)=3 mT(n-m-1) T(n-2)=3 mT(n-m-2