查看Optional
的示例用法,其中可选项首先加载数据库调用,然后映射到Spring安全UserDetails
实例。代码如下所示:
Optional<User> user = userRepository.findByName(username);
user.orElseThrow(()-> new UsernameNotFoundException("Ahhh Shuckkkks!!!");
return user.map(CustomUserDetails::new).get();
在最后一行中,该调用将等于return new CustomUserDetails(user.get())
。
也有人知道如果有更短流畅的方式来编写上面的例子吗?
答案 0 :(得分:10)
是的,那是相同的。但代码应该写成
return userRepository.findByName(username)
.map(CustomUserDetails::new)
.orElseThrow(()-> new UsernameNotFoundException("Ahhh Shuckkkks!!!"));
这避免了一个无用的变量,在最后隔离了特殊情况,并避免了对get()
的恶意调用,这只能保证在这里工作正常,因为你之前调用了orElseThrow()
。 p>