Как избежать исключения нулевого указателя с помощью SpEL - PullRequest
0 голосов
/ 10 июля 2019

У меня есть следующее утверждение:

@PreAuthorize("@securityService.isAllowedAccessByCurrentUser(@followingServiceImpl.findOne(#id).user.id)")
public void delete(@PathVariable("id") final Long id) {

Спецификация метода принимает идентификатор следующего объекта, который будет удален, если существует следующий объект с таким идентификатором.

Оператор PreAuthorize будет работать до тех пор, пока findOne (#id) не возвращает ноль (не ноль, если объект существует с таким идентификатором).

Проблема возникает, если переданный идентификатор не принадлежит следующему объекту, что будет означать, что .user приведет к исключению нулевого указателя. Каков наилучший способ передачи userId, если он существует (существует следующий объект), и, если он не существует, мы можем передать null в isAllowedAccessByCurrentUser.

В настоящее время, как есть, мы получаем исключение нулевого указателя, если следующий объект с указанным идентификатором не существует

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете использовать оператор безопасной навигации (т.е. ?.) для навигации по структуре объекта. Он вернет ноль вместо броска NullPointerException при доступе к свойству со значением ноль:

@PreAuthorize("@securityService.isAllowedAccessByCurrentUser(@followingServiceImpl.findOne(#id)?.user?.id)")

Но в этом случае я не буду помещать слишком много логики в SpEL. Я попытаюсь инкапсулировать всю логику проверки в одном методе bean-компонента. SpEL в @PreAuthorize просто ссылается на этот метод, аналогичный this . Это гораздо легче понять, и обычный вызов метода Java намного быстрее, чем решение SpEL, а также обеспечивает безопасность типов.

...