使用tkaczmarzyk库时如何创建带参数的Spring Specification对象?
解答
你不需要手动编写AnimalSearch的实现类,tkaczmarzyk arg-resolver库本身提供了动态生成Specification实例的能力,两种常用的简便实现方式如下:
方式1:非Web场景用SpecificationBuilder直接构造
如果是在业务代码里手动传参构造查询条件,直接调用库提供的SpecificationBuilder工具类即可,代码示例:
import net.kaczmarzyk.spring.data.jpa.utils.SpecificationBuilder; public void myMethod() { AnimalSearch search = SpecificationBuilder.builderFor(AnimalSearch.class) .withParam("color", "my_color") .withParam("name", "my_name") .build(); Collection<Animal> animalsFiltered = animalRepository.findAll(search); // 其他业务逻辑 }
方式2:Web场景直接作为Controller参数自动注入
如果查询参数来自前端HTTP请求,你不需要手动构造实例,直接将AnimalSearch声明为Controller接口的入参即可,框架会自动把请求参数和注解规则绑定,生成可用的实例:
@RestController @RequestMapping("/animal") public class AnimalController { @Autowired private AnimalRepository animalRepository; @GetMapping("/list") public List<Animal> getFilteredAnimals(AnimalSearch search) { return animalRepository.findAll(search); } }
当前端发起请求GET /animal/list?color=my_color&name=my_name时,会自动完成参数封装,无需额外编码。
前置配置校验
使用前需要确保你已经完成了基础配置:
- 已经正确引入了库的依赖
- Spring MVC配置中已经注册了对应参数解析器:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new SpecificationArgumentResolver()); } }
内容的提问来源于stack exchange,提问作者Andrei Manolache
相关产品推荐
相关产品推荐

