Java Optional.flatMap传入UserDao方法引用时类型不匹配报错排查
报错原因
核心是方法引用的用法错误,结合报错信息可定位到两个具体问题:
Optional.flatMap要求传入的参数是Function<? super String, ? extends Optional<U>>类型,即入参为String、返回值为Optional类型的函数。你写的UserDao::findOneWithAuthoritiesByLogin属于「类名::实例方法」的方法引用形式,这种写法要求匹配的函数式接口第一个入参必须是UserDao类型(对应调用方法的实例对象),和flatMap要求的入参类型String完全不匹配。findOneWithAuthoritiesByLogin是UserDao接口的实例方法,由Spring Data JPA在运行时生成代理实现,必须通过Spring容器管理的UserDaoBean实例才能调用,不能直接用接口类名引用。编译器尝试在UserDao中找入参为String的静态方法匹配函数签名,自然会抛出找不到符号的错误。
修复方案
按以下两步修改即可:
- 在
getUserWithAuthorities方法所在的类(报错提示为AuthenticationController)中,注入UserDao的Bean实例:
// 注入UserDao实例,若项目使用构造器注入替换成对应写法即可 @Autowired private UserDao userDao;
- 修正flatMap中的方法引用,使用注入的Bean实例调用方法:
public Optional<User> getUserWithAuthorities() { return SecurityUtils.getCurrentUserLogin().flatMap(userDao::findOneWithAuthoritiesByLogin); }
如果修改后仍报编译错误,可尝试清理IDE缓存、重新执行项目构建,避免增量编译导致的符号识别异常。
内容的提问来源于stack exchange,提问作者DBams
相关产品推荐
相关产品推荐

