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

Spring整合Specification-Arg-Resolver启动报错问题求助

问题解决:specification-arg-resolver配置冲突导致的Bean缺失与构造方法异常

问题场景

开发REST API动态搜索功能时,引入specification-arg-resolver后遇到两类异常:

  • 启用自定义配置类(添加SpecificationArgumentResolver)时,Spring启动报错找不到DriverEntityRepository Bean
  • 注释配置类后,请求接口时抛出java.lang.IllegalStateException: No primary or single unique constructor found for interface org.springframework.data.jpa.domain.Specification

相关代码片段:

Service代码

@Service
@RequiredArgsConstructor
public class DriverService {
    private final DriverEntityRepository driverEntityRepository;

    public Set<DriverEntity> getAllWithSpec(Specification<DriverEntity> customerSpec, Pageable pageable) {
        return driverEntityRepository.findAll(customerSpec, pageable);
    }
}

Controller代码

@GetMapping("/test2")
public Set<DriverDTO> test3(
        @And({
                @Spec(path = "name", spec = Equal.class),
                @Spec(path = "surname", spec = Equal.class)
        }) Specification<DriverEntity> customerSpec,
        Pageable pageable) {
    Set<DriverEntity> driverEntities = driverService.getAllWithSpec(customerSpec, pageable);
    return modelMapperService.mapSetToSetOfEnteredClass(driverEntities, DriverDTO.class);
}

配置类代码

@Configuration
@EnableJpaRepositories
public class MyConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new SpecificationArgumentResolver());
        }
    }

解决方案

1. 修复@EnableJpaRepositories的扫描路径

配置类中的@EnableJpaRepositories未指定扫描包,导致Spring无法识别Repository接口。修改配置类,添加Repository所在包路径:

@Configuration
@EnableJpaRepositories(basePackages = "com.example.repository") // 替换为你的Repository实际包路径
public class MyConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new SpecificationArgumentResolver());
    }
}

2. 确保Repository继承JpaSpecificationExecutor

DriverEntityRepository必须继承JpaSpecificationExecutor接口,才能支持基于Specification的查询:

public interface DriverEntityRepository extends JpaRepository<DriverEntity, Long>, JpaSpecificationExecutor<DriverEntity> {
    // 自定义查询方法(如有)
}

3. 检查Spring Boot主类的扫描范围

如果项目主类不在根包(如com.example),需确保@SpringBootApplication注解包含Service和Repository所在的包:

@SpringBootApplication(scanBasePackages = {"com.example.service", "com.example.repository"})
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

问题原因说明

  • 启用配置类时:@EnableJpaRepositories覆盖了Spring Boot默认的Repository扫描逻辑,未指定包路径导致Spring无法扫描到DriverEntityRepository,进而无法生成Bean
  • 注释配置类时:Spring无法识别@Spec、@And等注解,尝试直接实例化Specification接口(接口无法被实例化),因此抛出构造方法异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:28:01