Внедрить данные, связанные с пользователем, в метод REST API

Предположим, у нас есть приложение Весенний ботинок, которое управляет несколькими пользователями, задачами пользователя и друзьями пользователя. User может иметь несколько связанных Task, а также может иметь несколько Friend.

Spring Boot позволяет вводить текущего пользователя через определение аннотации @CurrentUser следующим образом:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@AuthenticationPrincipal
public @interface CurrentUser {

}

Следовательно, можно реализовать следующие методы контроллера REST API:

@...
public ResponseEntity<List<Task>> getTasks(@CurrentUser CustomUserDetails currentUser) {
    List<Task> result = taskService.getTasksForUser(currentUser.getId()); // NOTE: taskService is @Autowired
    return ResponseEntity.ok(result);
}

@...
public ResponseEntity<List<Task>> getSharedTasks(@CurrentUser CustomUserDetails currentUser) {
    List<Friend> friends = friendService.getFriendsForUser(currentUser.getId());
    List<Task> tasks = taskService.getTasksForUser(currentUser.getId());
    List<Task> result = tasks.stream().filter(x -> x.isSharedWith(friends)).collect(Collectors.toList());
    return ResponseEntity.ok(result);
}

Я хотел бы избавиться от явных обращений к реализациям Service или Repository для получения Task и Friend. Я бы предпочел такие сигнатуры методов:

public ResponseEntity<List<Task>> getTasks(@CurrentUser CustomUserDetails currentUser,
                                           @CurrentUserTasks List<Task> userTasks) { ... }

public ResponseEntity<List<Task>> getTasks(@CurrentUser CustomUserDetails currentUser,
                                           @CurrentUserTasks List<Task> userTasks,
                                           @CurrentUserFriends List<Friend> userFriends) { ... }

Кроме того, я хотел бы предоставить собственный метод, чтобы фактически определить, какие Task и Friend предоставляются данному пользователю, например:

public List<Friend> getFriendsForUser(CustomUserDetails user) { ... }

Предоставляет ли Spring Boot возможность вводить такие данные в метод REST API?

Вы смотрели на Producer в сочетании с AnnotationLiterals? Я не работаю с Spring Boot, но думаю, что это возможно.

Nico 27.09.2018 11:25

Я не могу найти аннотацию @CurrentUser при весенней загрузке.

kingGarfield 27.09.2018 12:16
@CurrentUser определен в OP.
trylimits 27.09.2018 14:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
37
0

Другие вопросы по теме