Должен ли я предпочесть метод `ifPresent` методу` isPresent`? - PullRequest
0 голосов
/ 04 мая 2019

У меня есть этот код с использованием последнего:

Optional<String> subject = Optional.ofNullable(claims.get().getSubject());
if (subject.isPresent()) {
  UserDetails userDetails = userDetailsService.loadUserByUsername(subject.get());
  UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails,
      null, userDetails.getAuthorities());
  authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
  logger.debug("Security - The request authenticated fine from the JWT Access token");
  return authentication;
} else {
  throw new BadCredentialsException("The authentication token " + optToken + " did not contain a subject.");
}

Я пытаюсь реорганизовать это с помощью метода ifPresent.

Должен ли я получить сервисный вызов userDetailsService.loadUserByUsername довызов функционального метода?Если да, то как?Как вернуть объект типа, отличного от типа функционального метода?

Я нахожусь на Java 12.

Ответы [ 3 ]

3 голосов
/ 04 мая 2019

Используйте метод map для преобразования значения Optional.После преобразования вы можете использовать метод orElseThrow для распаковки Optional, выдавая исключение, если оно пустое.

Примерно так:

return Optional.ofNullable(claims.get().getSubject())
               .map(userDetailsService::loadUserByUsername)
               .map(userDetails -> {
                   UsernamePasswordAuthenticationToken authentication = 
                       new UsernamePasswordAuthenticationToken(
                           userDetails, null, userDetails.getAuthorities());
                   authentication.setDetails(
                       new WebAuthenticationDetailsSource().buildDetails(request));
                   return authentication;
               })
               .orElseThrow(() -> new BadCredentialsException(
                  "The authentication token " + optToken + " did not contain a subject."));

Однако в вашемВ конкретном случае может быть проще вообще не использовать Optional.Вы можете просто проверить на ноль немедленно.

String subject = claims.get().getSubject();
if (subject == null) {
    throw new BadCredentialsException(
        "The authentication token " + optToken + " did not contain a subject.");
}

UsernamePasswordAuthenticationToken authentication = ... ;
2 голосов
/ 04 мая 2019

В этом случае вы можете использовать orElseThrow, который выдает исключение, если значение отсутствует:

String subjectValue = subject.orElseThrow(() ->
    new BadCredentialsException("The authentication token " + optToken + " did not contain a subject."));
...
0 голосов
/ 04 мая 2019

Если вы действительно хотите использовать ifPresent, вы можете сделать что-то вроде

subject.ifPresent(s -> {
     UserDetails userDetails = loadUserByUsername(s);
     ...
});

, но если вы бросаете пропущенный предмет, почему бы просто не сделать

String subject = Optional.ofNullable(claims.get().getSubject())
        .orElseThrow(() -> new BadCredentialsException(...));
UserDetails userDetails = loadUserByUsername(subject);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...