You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot本地运行线上正常项目遇UnsatisfiedDependencyException问题

问题分析与解决方案

嘿,我来帮你搞定这个Spring Boot启动异常!从你贴的代码和日志来看,问题根源很明确——你的EventCategoryRepository里的自定义JPQL查询语句验证失败了,导致整个Bean创建链出了问题。

先给你理清楚问题所在,再给你解决方案:


问题拆解

首先看最关键的异常信息:

java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.Optional com.demo.eventsetup.eventcategory.repository.EventCategoryRepository.findByNameIgnoreCase(java.lang.String)!

结合你的代码细节,问题出在这两个点:

  1. JPQL属性名与实体映射不匹配
    你的EventCategory实体用了@Where(clause = "ec_deactivated IS NULL"),这里的ec_deactivated是数据库的列名;但在Repository的JPQL里,你写的是eventCategory.deactivated IS NULL。如果你的EventCategory或者它继承的LocationDomainObject里没有deactivated这个属性,或者这个属性没有正确映射到ec_deactivated列,JPA就会找不到这个字段,直接报错。

  2. 重复的过滤条件
    其实你已经通过@Where注解给EventCategory加了全局过滤,所有查询都会自动排除ec_deactivated不为空的记录,所以JPQL里再写AND eventCategory.deactivated IS NULL完全是多余的,反而可能引发解析问题。


具体修复方案

你可以选下面任意一种方式来解决:

方案一:简化JPQL(推荐)

既然@Where已经帮你自动过滤了已注销的分类,直接删掉冗余的条件就行:

public interface EventCategoryRepository extends PagingAndSortingRepository<EventCategory, UUID> {
    @Query( "FROM EventCategory eventCategory WHERE UPPER( eventCategory.name ) = UPPER( :name )" )
    Optional<EventCategory> findByNameIgnoreCase( @Param( "name" ) String name );
}

方案二:修正实体属性映射

如果你确实需要手动控制这个过滤条件(比如某些场景要查已注销的记录),那得确保实体类里有对应的属性:
在LocationDomainObject或者EventCategory类里添加:

@Column(name = "ec_deactivated")
private LocalDateTime deactivated;

// 别忘了加getter和setter方法

这样JPQL里的eventCategory.deactivated就能正确映射到数据库的ec_deactivated列了。


额外检查项

最后再帮你确认几个容易踩坑的点:

  • 你的启动类EventSetupApplication在com.demo.eventsetup包下,从包结构(package structure)来看,Spring Boot能自动扫描到子包下的Repository和实体类,这部分没问题。
  • 确认本地数据库的eventsetup schema存在,event_category表的结构和实体类的映射完全一致,比如列名、类型都要对应上。

按照上面的方法改完,重启应用应该就能正常启动啦!

内容的提问来源于stack exchange,提问作者AKA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:51:53