Spring Security配置类出现类型参数'S'推断超出边界错误如何解决
报错原因
该报错由Spring Data JPA版本迭代导致的方法签名不匹配触发:
- 你当前使用的Spring Data JPA为2.x及以上版本,原有
CrudRepository接口中findOne(ID id)方法已被移除,官方替换为findById(ID id)方法 - 当前版本保留的
findOne()方法签名为<S extends T> Optional<S> findOne(Example<S> example),要求入参为Example类型实例,且泛型约束要求对应实体类必须是Reader的子类 - 你直接传入
String类型的用户名调用findOne(),触发了泛型类型校验失败,就抛出了该类型不匹配错误。
解决方案
方案一(推荐):适配2.x版本API修改调用方法
直接将SecurityConfig类中的报错行替换为findById调用,同时处理空值场景符合Spring Security规范:
@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { return readerRepository.findById(username) .orElseThrow(() -> new UsernameNotFoundException("用户不存在:" + username)); }
方案二:自定义查询方法兼容多版本
你也可以在ReaderRepository接口中新增自定义查询方法,不受Spring Data JPA版本变更影响:
- ReaderRepository新增方法定义:
@Repository public interface ReaderRepository extends JpaRepository<Reader, String> { Reader findByUsername(String username); } - 修改SecurityConfig中的调用逻辑:
return readerRepository.findByUsername(username);
内容的提问来源于stack exchange,提问作者Allen Vieira
相关产品推荐
相关产品推荐

