Spring依赖注入异常排查:ProductRepo自定义查询验证失败
排查org.springframework.beans.factory.UnsatisfiedDependencyException异常及解决方法
异常详情
持续抛出
org.springframework.beans.factory.UnsatisfiedDependencyException异常,报错链路如下:
- 创建
productControllerBean失败:字段service依赖未满足- 创建
productServiceBean失败:字段repo依赖未满足- 创建
com.example.ecomwebsitejava.repo.ProductRepo的productRepoBean失败:无法为searchproduct方法生成查询,查询验证不通过
各层代码片段
Controller层(已添加@Autowired、@RestController注解)
@GetMapping("/products/search") public ResponseEntity<List<Product>> searchproduct(@RequestParam String keyword) { List<Product> products = service.searchproduct(keyword); return new ResponseEntity<>(products, HttpStatus.OK); }
Service层(已添加@Service注解)
public List<Product> searchproduct(String keyword) { return repo.searchproduct(keyword); }
Repo层(已添加@Repository注解)
public interface ProductRepo extends JpaRepository<Product, Integer> { @Query("SELECT p FROM Product p WHERE"+ "LOWER(p.name) LIKE LOWER(CONCAT('%' , :keyword, '%')") List<Product> searchproduct(String keyword); }
异常原因
核心问题出在Repo层的JPQL语句上:
- 语法错误:
CONCAT('%' , :keyword, '%')缺少闭合的右括号,导致JPQL解析失败 - 潜在语法隐患:字符串拼接后
WHERE和LOWER直接连在一起(WHERELOWER),属于无效的JPQL语法
这些错误导致Spring无法正确生成ProductRepo的代理Bean,进而引发后续依赖注入的连锁异常。
解决方法
修正Repo层的JPQL查询语句,补全括号并修复空格问题:
public interface ProductRepo extends JpaRepository<Product, Integer> { @Query("SELECT p FROM Product p WHERE " + "LOWER(p.name) LIKE LOWER(CONCAT('%', :keyword, '%'))") List<Product> searchproduct(String keyword); }
额外检查项:
- 确认
Product实体类中存在name字段,且字段名称与JPQL中的p.name完全匹配(若使用默认命名策略,字段名大小写需一致) - 确保Service层通过
@Autowired正确注入ProductRepo,Controller层通过@Autowired正确注入对应Service实例
内容的提问来源于stack exchange,提问作者Jhadtheelasainischalsatwikqame
相关产品推荐
相关产品推荐

