Java spring自定义验证器构造函数

Java spring自定义验证器构造函数,java,spring,validation,Java,Spring,Validation,我有自定义验证器 public class SimpleValidator implements ConstraintValidator<Simple, String> { private SimpleDao dao; //@Autowired public SimpleValidator (SimpleDao<String> dao) { this.dao = dao; } @Override

我有自定义验证器

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;
    }
}
公共类SimpleValidator实现ConstraintValidator{
私家简易道;
//@自动连线
公共SimpleValidator(SimpleDao-dao){
this.dao=dao;
}
@凌驾
公共void初始化(简单注释){
}
@凌驾
公共布尔值有效(字符串值、ConstraintValidatorContext上下文){
返回dao.someAction(值);
}
}
公共类MyService{
//@自动连线
私人验证器;
公共MyService(验证器验证器){
this.validator=验证程序;
}
公共绑定结果方法(SimpleDto){
BindingResult=新的BeanPropertyBindingResult(dto,“dto”);
validator.validate(dto,结果);
返回结果;
}
}
当我使用annotation@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>

...
org.hibernate.hql.ast.ASTQueryTranslatorFactory
${hibernate.dial}
${hibernate.hbm2ddl.auto}
${hibernate.show_sql}
${encoding}
汽车
我得到一个例外:

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
原因:org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.jtalks.jcommune.model.validation.validators.SimpleValidator]:未找到默认构造函数;嵌套异常是java.lang.NoSuchMethodException:org.jtalks.jcommune.model.validation.validators.SimpleValidator。()
位于org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:83)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.InstanceBean(AbstractAutowireCapableBeanFactory.java:1006)
... 126多
原因:java.lang.NoSuchMethodException:org.jtalks.jcommune.model.validation.validators.SimpleValidator.()
位于java.lang.Class.getConstructor0(Class.java:2730)
位于java.lang.Class.getDeclaredConstructor(Class.java:2004)
位于org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:78)
... 127多
是否能够为验证器使用xml配置?如何在不使用@Autowired annotation的情况下用SimpleDao实例化验证器?

替换以下内容

<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>

更新

考虑在HibernateDAO中实现的SimpleDao接口

 <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;   

  }

公共类SimpleValidator实现ConstraintValidator{
私家简易道;
}

未找到默认构造函数
-消息已清除。是的,我可以创建默认构造函数。但我需要用SimpleDao安装验证器。如果我为dao创建默认构造函数和setter,则不会发生异常,但dao将为空。我认为spring不使用xml配置来解析验证器的依赖关系,但为什么呢?spring将解析xml文件中的所有依赖关系。可以使用validator DAO依赖项更新您的问题。对于第一个加载应用程序,我看到它确实如此(validator使用xml配置成功初始化),但当我使用validator.validate(…)时,我得到了问题答案,这是我的错误。当然有。我试过两个案例:1。构造函数(带SimpleDao)2。SimpleDao设置的默认构造函数幸运的是,我得到了相同的结果