2013-09-01 60 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