我使用的是后者的代码:
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。
答案 0 :(得分:3)
使用)
方法来转换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
答案 1 :(得分:2)
在这种情况下,您可以使用orElseThrow
,如果不存在该值,则会抛出异常:
String subjectValue = subject.orElseThrow(() ->
new BadCredentialsException("The authentication token " + optToken + " did not contain a subject."));
...
答案 2 :(得分:0)
如果您真的想使用ifPresent
,可以做类似的事情
subject.ifPresent(s -> {
UserDetails userDetails = loadUserByUsername(s);
...
});
但是既然您丢了一个丢失的主题,为什么不干脆
String subject = Optional.ofNullable(claims.get().getSubject())
.orElseThrow(() -> new BadCredentialsException(...));
UserDetails userDetails = loadUserByUsername(subject);
...