Spring多模块项目XML配置自定义ConstraintValidator失效排查求助
多模块Spring项目中Hibernate Validator XML配置失效排查求助
问题概述
在通过ServiceLoader关联注解与ConstraintValidator实现的Spring多模块项目中,仅XML形式的验证配置失效。注解式配置全程正常,单模块下XML配置也能正常工作,求排查思路。
更新进展
- 若应用启动后首次请求为REST接口(注解式配置),缺失的初始化逻辑会被触发,后续包括XML配置的验证均正常;
- 若首次请求通过Kafka触发XML配置逻辑,初始化未完成,后续所有验证均失效。
背景信息
当注解与Validator实现同模块时,可通过@Constraint(validatedBy = HasClassTypeValidator.class)直接绑定;多模块场景下需将@Constraint(validatedBy = {})留空,通过ServiceLoader配置文件定义配对关系。
针对自动生成的代码,需通过META-INF/validation.xml和validation-constraints.xml配置验证规则,示例如下:
<!-- validation.xml --> <validation-config xmlns="http://xmlns.jcp.org/xml/ns/validation/configuration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/validation/configuration http://xmlns.jcp.org/xml/ns/validation/configuration/validation-configuration-2.0.xsd" version="2.0"> <constraint-mapping>/META-INF/validation-constraints.xml</constraint-mapping> </validation-config>
<!-- validation-constraints.xml --> <constraint-mappings xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/validation/mapping http://xmlns.jcp.org/xml/ns/validation/mapping/validation-mapping-2.0.xsd" version="2.0"> <bean class="Whatever"> <class ignore-annotations="false"/> <getter name="whatever" ignore-annotations="false"> <constraint annotation="javax.validation.constraints.NotNull"/> <constraint annotation="whatever.CustomValidation"/> </getter> </bean> </constraint-mappings>
问题详情
Spring默认自动配置的LocalValidatorFactoryBean中,通过ServiceLoader声明的自定义约束在注解式验证中处处生效,但XML配置仅内置约束有效,自定义约束无法被识别。
断点调试显示:
- ServiceLoader能正常发现自定义Validator;
- LocalValidatorFactoryBean初始化时,
org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper#registerCustomConstraintValidators方法也能找到这些Validator;
但实际验证时却提示自定义约束未声明。
单模块下所有配置(注解、Validator、XML、ServiceLoader文件)均正常;仅将注解与Validator移至其他模块时,XML配置失效,ServiceLoader文件位置不影响结果。
求助方向
Hibernate Validator内部逻辑复杂,求指点排查方向:为何初始化时已发现的ConstraintValidator在验证时不可用?
内容的提问来源于stack exchange,提问作者Martin Mucha
相关产品推荐
相关产品推荐

