Как назначить список вещей другому списку вещей с помощью конечной точки - PullRequest
2 голосов
/ 01 августа 2020

У меня есть конечная точка, которая назначает список ролей одному пользователю .

@PutMapping(value = "/roles/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
public UserDto modifyRoles(
    @ApiParam(value = "User ID", required = true) @PathVariable("id") Long id,
    @ApiParam(value = "List of ID roles", required = true) @RequestBody List<Long> roles)
    throws someExceptions {
    return serviceClass.modifyUserRoles(id, roles);
}

Я хочу получить список пользователей а также список ролей , чтобы я мог назначить каждую роль каждому пользователю, но я не уверен, как это сделать, и должен ли я отправлять список пользователей через @PathVariable, или если я есть способ лучше. Вот что я пробовал:

@PutMapping(value = "/roles/{usersId}", consumes = MediaType.APPLICATION_JSON_VALUE)
public List<UserDto> modifyMultipleRoles(
    @ApiParam(value = "List of User ID", required = true) @PathVariable("id") List<Long> ids,
    @ApiParam(value = "List of ID roles", required = true) @RequestBody List<Long> roles)
    throws someExceptions {
    return serviceClass.newMethodThatAssignEachRoleToEachUser(ids, roles);
}

Это лучший способ сделать это? Это вообще сработает?

Спасибо

Ответ на обновление

Это то, что я пробовал прямо сейчас

List<Long> usersId=objectDto.getUsersId();
List<Long> rolesToAdd = objectDto.getRolesToAdd();
List<Long> rolesToDelete = objectDto.getRolesToRemove();
            
List<Usuario> users = usersId.stream()
                    .map(userId -> this.findById(userId))
                    .collect(Collectors.toList());
            
return users.stream().
// ????

Это способ продолжить?

Ответы [ 3 ]

1 голос
/ 01 августа 2020

Самый простой способ сделать это - обернуть этот список одним и тем же объектом и использовать этот объект как параметр requestBody:

public class UsersRolsRequest (){
    private List<Long> users;
    private List<Long> rols;
}

Окончательный результат должен быть таким:

@PutMapping(value = "/roles/{usersId}", consumes = MediaType.APPLICATION_JSON_VALUE)
public List<UserDto> modifyMultipleRoles(@ApiParam(value = "Object with the list of ID 
        users and the List of ID roles", required = true) @RequestBody UsersRolsRequest 
        request)throws someExceptions {
    return serviceClass.newMethodThatAssignEachRoleToEachUser(ids, roles);
}

Запрос json будет иметь вид:

{
    "users": [1,2,3],
    "rols": [1,1,2]
}
1 голос
/ 01 августа 2020
  • Ваше текущее решение не будет работать, так как вы не можете указать список в качестве параметра пути. Итак, вы хотите иметь единую полезную нагрузку, которая представляет собой список user s и role s

  • И тогда первый вопрос: хотите ли вы изменить одни и те же роли для каждого пользователя или вы хотите изменить разные роли для каждого пользователя ?. В зависимости от этого ответа полезная нагрузка может быть одной из вариаций

     {
       "users": ["user1", "user2"],
       "roles": ["role1", "role2"]
     }

или

    [
       { 
         "id: "user1"
         "roles": ["role1", "role2"]
       },
       { 
         "id: "user2"
         "roles": ["role2", "role3"]
       },
    ]
  • После того, как вы приняли это решение , второй вопрос о значении modifying ролей. Означает ли это добавление некоторых ролей и удаление некоторых других ролей или замену текущих ролей пользователя новым набором ролей?

    • Http Patch отклонение 1
    • Http Patch отклонение 2
    • Http Put отклонение 1
    • Http Put отклонение 2
      {
         "users": ["user1", "user2"],
         "rolesToAdd": ["role1", "role2"]",
         "rolesToRemove": ["role3"]
      }
    [
       { 
         "id: "user1"
         "rolesToAdd": ["role1"],
         "rolesToRemove": ["role2"],
       },
       { 
         "id: "user2"
         "rolesToAdd": ["role2", "role3"],
         "rolesToRemove": ["role4"],
       },
    ]
      {
         "users": ["user1", "user2"],
         "roles": ["role1", "role2"]",
      }
    [
       { 
         "id: "user1"
         "roles": ["role1", "role2"]
       },
       { 
         "id: "user2"
         "roles": ["role2", "role3"]
       },
    ]
  • Тогда речь идет о создании объекта java для представления полезной нагрузки и соответствующего сохранения

Обновление

  • Вы можете создать ModfifyUsersRoleRequest лайк с геттерами и сеттерами для этих 3 полей. Затем вы можете использовать его как @RequestBody. Как только вы войдете в метод, выполните вызов репозитория spring-data-jpa, чтобы получить всех пользователей с этими идентификаторами пользователей, и вы получите обратно список пользователей. Затем для каждого пользователя добавьте новые роли и удалите роли, которые вы хотите удалить
1 голос
/ 01 августа 2020

Вам нужно создать класс запроса, как показано ниже, как @ RequestBody

{
    "users": ["user1", "user2"],
    "roles": ["role1", "role2"]
}


public class RolesRequestBoday {
    public List<String> users;
    public List<String> roles;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...