カスタムにBeanを注入しようとしていますConstraintValidator
。私はいくつかのことに出くわしました:
- CDIはvalidation-api-1.1.0でサポートされています(ベータ版が利用可能)
- Hibernate Validator 5はvalidation-api-1.1.0を実装しているようです(アルファ版が利用可能)
- 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;
}
そしてバッキングビーン:
@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}" />
バリデーターが呼び出されますが、フィールドは自動配線/挿入されず、nullのままです。もちろん、これはNullPointerExceptionをスローします。
私はこれをHibernateバリデーター4.2でテストしてLocalValidatorFactoryBean
います(これができるはずだからです)。