我正在尝试将 bean 注入到 customConstraintValidator
中。我遇到了一些事情:
- 在 validation-api-1.1.0 中支持 CDI(提供 Beta 版)
- Hibernate Validator 5 似乎实现了validation-api-1.1.0(可用Alpha)
- 使用 Seam 验证模块
- 使用 Spring 的 LocalValidatorFactoryBean
最后一个似乎最适合我的情况,因为我们已经在使用 Spring (3.1.3.Release)。
我已将验证器工厂添加到 XML 应用程序上下文并启用了注释:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="com.example" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
</beans>
验证者:
public class UsernameUniqueValidator implements
ConstraintValidator<Username, String>
{
@Autowired
private PersonManager personManager;
@Override
public void initialize(Username constraintAnnotation)
{
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context)
{
if (value == null) return true;
return personManager.findByUsername(value.trim()) != null;
}
}
验证应用于Person
:
public class Person
{
@Username
private String username;
}
和支持bean:
@Named
@Scope("request")
public class PersonBean
{
private Person person = new Person();
@Inject
private PersonManager personManager;
public create()
{
personManager.create(person);
}
}
在 JSF 页面中,我有:
<p:inputText value="#{personBean.person.username}" />
验证器被调用,但该字段未自动装配/注入并保持为空。这当然会引发 NullPointerException。
我正在使用 Hibernate 验证器 4.2 进行测试(因为LocalValidatorFactoryBean
我认为应该能够做到这一点)。