我有一些业务验证逻辑,形式为“X is valid IFF Service Y return Z”,其中X和Z在编译时是已知的,Y的位置是从Spring配置文件加载的。
我想使用基于JSR-303注释的验证和Spring配置,所以我可以编写如下代码:
自定义类级别约束注释:
@MyValidation
public class X { .... }
@MyValidation 的ConstraintValidator:
public class MyValidationValidator implements ConstraintValidator<MyValidation, X> {
private MyService service;
public MyService getService() { return service; }
public void setService(MyService serv) { this.service = serv; }
//Validation Logic...
}
Spring config:
<bean id="ServiceY" class="...">
...
</bean>
<bean id="mvv" class="MyValidationValidator">
<property name="service" value="ServiceY" />
</bean>
但是我尝试以这种方式组合它们的尝试都失败了,因为验证器的属性没有设置。
现在,我正在使用Spring AOP拦截器作为解决方法,但这在我看来并不理想。
这里的其他问题之一让我想到使用属性文件/属性,但这不是要求我重复服务的配置吗?
另一个提到以编程方式定义约束映射,但如果我这样做,我可能会更好地解决我的问题。
有关如何进行动态配置的任何线索?
答案 0 :(得分:0)
您应该使用Spring的LocalValidatorFactoryBean
来设置Bean Validation验证器:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
以这种方式设置的验证器将在内部使用ConstraintValidatorFactory
实现,该实现对创建的验证器实例执行依赖注入,只需使用service
或{{标记验证器中的@Inject
字段1}}。请注意,不需要将约束验证器本身设置为Spring bean。
您可以在Spring reference guide中找到更多详细信息。