2013-09-01 62 views
-1

我有自定义的验证春自定义的验证构造

public class SimpleValidator implements ConstraintValidator<Simple, String> { 

    private SimpleDao dao; 

    //@Autowired 
    public SimpleValidator (SimpleDao<String> dao) { 
     this.dao = dao; 
    } 

    @Override 
    public void initialize(Simple annotation) { 

    } 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 
     return dao.someAction(value); 
    } 
} 

public class MyService { 
    //@Autowired 
    private Validator validator; 
    public MyService (Validator validator) { 
     this.validator = validator; 
    } 

    public BindingResult SomeMethod(SimpleDto dto) { 
     BindingResult result = new BeanPropertyBindingResult(dto, "dto"); 
     validator.validate(dto, result); 
     return result; 
    } 
} 

当我使用注释@Autowired(用于为MyService类验证),并尝试验证一些DTO,它的成功验证。但是,当我尝试使用XML配置

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 
<bean class="org.springframework.validation.beanvalidation.BeanValidationPostProcessor"> 
    <property name="validator" ref="validator"/> 
</bean> 

<bean id="simpleValidator" class="org.jtalks.jcommune.model.validation.validators.SimpleValidator"> 
    <constructor-arg ref="validatorDAO"/> 
</bean> 

<bean id="myService" class="org.jtalks.jcommune.service.transactional.MyService"> 
    <constructor-arg ref="validator"/> 
</bean> 

<bean id="validatorDAO" 
    class="org.jtalks.jcommune.model.dao.hibernate.ValidatorHibernateDao"> 
    <constructor-arg ref="sessionFactory"/> 
</bean> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="dataSource" ref="dataSource"/> 
<property name="mappingResources"> 
... 
</property> 
<property name="hibernateProperties"> 
    <props> 
    <prop key="hibernate.query.factory_class"> 
     org.hibernate.hql.ast.ASTQueryTranslatorFactory 
    </prop> 
    <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
    <prop key="hibernate.connection.charset">${encoding}</prop> 
    <prop key="hibernate.connection.release_mode">auto</prop> 
    </props> 
</property> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

我得到异常:

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.jtalks.jcommune.model.validation.validators.SimpleValidator]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.jtalks.jcommune.model.validation.validators.SimpleValidator.<init>() 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1006) 
... 126 more 
Caused by: java.lang.NoSuchMethodException: org.jtalks.jcommune.model.validation.validators.SimpleValidator.<init>() 
at java.lang.Class.getConstructor0(Class.java:2730) 
at java.lang.Class.getDeclaredConstructor(Class.java:2004) 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78) 
... 127 more 

有没有能够使用XML配置验证?如何在不使用@Autowired注释的情况下使用SimpleDao实例化验证器?

+2

'没有找到默认构造函数“ - 消息已清除。 – Tala

+0

是的,我可以创建默认的构造函数。但我需要用SimpleDao安装Validator。如果我为dao创建了默认构造函数和setter,则不会发生异常,但dao将为空。我认为spring不会使用xml config来为验证器解析依赖关系,但为什么? – gios

+0

spring将解析XML文件中的所有依赖项。可以用validatorDao依赖关系更新你的问题。 – Prabhakaran

回答

0

更换以下

<bean id="simpleValidator" class="com.example.validators.SimpleValidator"> 
    <property name="dao" ref="validatorDao"/> 
</bean> 

使用这一个。

<bean id="simpleValidator" class="com.example.validators.SimpleValidator"> 
     <constructor-arg ref="validatorDao"/>  
</bean> 

更新

考虑一个SimpleDAO接口ValidatorHibernateDao实现。

<bean id="simpleDao" class"org.jtalks.jcommune.model.dao.hibernate.SimpleDao" abstract="true"/> 

<bean id="validatorDAO" 
    class="org.jtalks.jcommune.model.dao.hibernate.ValidatorHibernateDao" parent="simpleDao"> 
    <constructor-arg ref="sessionFactory"/> 
</bean> 

    public class SimpleValidator implements ConstraintValidator<Simple, String> { 

    private SimpleDao<String> dao; 

    } 
+0

对不起,这是我的错误。当然有。我尝试了两种情况:1.构造函数(与SimpleDao)2.使用SimpleDao setter的默认构造函数 – gios

+0

用validatorDao依赖关系更新您的问题 – Prabhakaran

+0

更新答案 – Prabhakaran