Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测试时,Spring注入在自定义hibernate验证器中不起作用_Spring_Spring Mvc_Testng_Hibernate Validator - Fatal编程技术网

测试时,Spring注入在自定义hibernate验证器中不起作用

测试时,Spring注入在自定义hibernate验证器中不起作用,spring,spring-mvc,testng,hibernate-validator,Spring,Spring Mvc,Testng,Hibernate Validator,测试配置类 @Configuration @Import( value = GlobalCoreContext.class) public class TestConfiguration { @Bean public Validator createValidatorFactory() { return Validation.buildDefaultValidatorFactory().getValidator(); } } public final

测试配置类

@Configuration
@Import( value = GlobalCoreContext.class)
public class TestConfiguration {

    @Bean
    public Validator createValidatorFactory() {
        return Validation.buildDefaultValidatorFactory().getValidator();
    }

}
public final class LoginAttemptsExceededValidatorLoginId implements ConstraintValidator<LoginAttemptsExceeded, String> {

    @Resource
    private LoginDao loginDao;

    private LoginAttemptsExceeded loginAttemptsExceeded;

    @Override
    public void initialize(final LoginAttemptsExceeded loginAttemptsExceeded) {
        this.loginAttemptsExceeded = loginAttemptsExceeded;
    }

    /**
     * Validation fails if the login attempts have exceeded the preset number.
     * @param loginId
     * @param constraintValidatorContext
     * @return
     */
    @Override
    public boolean isValid(final String loginId, final ConstraintValidatorContext constraintValidatorContext) {
        if(StringUtility.IsEmpty(loginId)) return false;

        return !loginDao.findByLogin(loginId).isLoginAttemptsExceeded();
    }
}
@ContextConfiguration(classes = TestConfiguration.class )
public class LoginAttemptsExceededValidatorLoginIdTest extends AbstractTestNGSpringContextTests {

    @Autowired
    private Validator validator;
    private PasswordChange passwordChange;
    private LoginEntity loginEntity;
    private static final String TEST_PASSWORD = "abcDEFG10";
    private static final String TEST_LOGIN = "passwordChangeValidatorTestLogin";


    @Resource
    private LoginDao loginDao;

    @BeforeMethod
    public void setUp() throws Exception {

        passwordChange = new PasswordChange(TEST_LOGIN, TEST_PASSWORD, "newPassword");

        /**
         * setup a Login record
         */
        loginEntity = DataBuilder.createLogin();
        loginEntity.setLogin(TEST_LOGIN);
        loginEntity.setPasswordHash(encryptToBytes(TEST_PASSWORD));
        loginEntity.setLoginAttempts(0);
        loginDao.saveAndFlush(loginEntity);
    }

    @AfterMethod
    public void tearDown() throws Exception {
        // Remove the login record.
        loginDao.delete(loginEntity);
        loginDao.flush();
    }

    @Test
    public void testIsValid() throws Exception {
        Set<ConstraintViolation<PasswordChange>> constraintViolations = validator.validate(passwordChange);
        assertEquals(constraintViolations.size(), 0, "When a valid username, password are supplied, the number of errors should be zero.");

    }
}
验证类

@Configuration
@Import( value = GlobalCoreContext.class)
public class TestConfiguration {

    @Bean
    public Validator createValidatorFactory() {
        return Validation.buildDefaultValidatorFactory().getValidator();
    }

}
public final class LoginAttemptsExceededValidatorLoginId implements ConstraintValidator<LoginAttemptsExceeded, String> {

    @Resource
    private LoginDao loginDao;

    private LoginAttemptsExceeded loginAttemptsExceeded;

    @Override
    public void initialize(final LoginAttemptsExceeded loginAttemptsExceeded) {
        this.loginAttemptsExceeded = loginAttemptsExceeded;
    }

    /**
     * Validation fails if the login attempts have exceeded the preset number.
     * @param loginId
     * @param constraintValidatorContext
     * @return
     */
    @Override
    public boolean isValid(final String loginId, final ConstraintValidatorContext constraintValidatorContext) {
        if(StringUtility.IsEmpty(loginId)) return false;

        return !loginDao.findByLogin(loginId).isLoginAttemptsExceeded();
    }
}
@ContextConfiguration(classes = TestConfiguration.class )
public class LoginAttemptsExceededValidatorLoginIdTest extends AbstractTestNGSpringContextTests {

    @Autowired
    private Validator validator;
    private PasswordChange passwordChange;
    private LoginEntity loginEntity;
    private static final String TEST_PASSWORD = "abcDEFG10";
    private static final String TEST_LOGIN = "passwordChangeValidatorTestLogin";


    @Resource
    private LoginDao loginDao;

    @BeforeMethod
    public void setUp() throws Exception {

        passwordChange = new PasswordChange(TEST_LOGIN, TEST_PASSWORD, "newPassword");

        /**
         * setup a Login record
         */
        loginEntity = DataBuilder.createLogin();
        loginEntity.setLogin(TEST_LOGIN);
        loginEntity.setPasswordHash(encryptToBytes(TEST_PASSWORD));
        loginEntity.setLoginAttempts(0);
        loginDao.saveAndFlush(loginEntity);
    }

    @AfterMethod
    public void tearDown() throws Exception {
        // Remove the login record.
        loginDao.delete(loginEntity);
        loginDao.flush();
    }

    @Test
    public void testIsValid() throws Exception {
        Set<ConstraintViolation<PasswordChange>> constraintViolations = validator.validate(passwordChange);
        assertEquals(constraintViolations.size(), 0, "When a valid username, password are supplied, the number of errors should be zero.");

    }
}
由于某种原因,
loginattentsexceeddvalidatorloginid
中的
loginDao
方法无效它在运行时运行良好。

但是在单元测试期间,
LoginDao
不会被注入到验证器中,即使
javax.validation.Validator
被注入到单元测试中


我做错了什么?

我猜你的问题就在这里:

@Bean
public Validator createValidatorFactory() {
    return Validation.buildDefaultValidatorFactory().getValidator();
}
这将构建默认的验证器,包括默认的ConstraintValidatorFactory,它不注入SpringBean。如果你查看文档,你会发现

默认情况下,LocalValidatorFactoryBean配置 SpringConstraintValidatorFactory,使用Spring创建 ConstraintValidator实例。这允许您进行自定义 约束验证程序从依赖项注入中获益 其他的春豆

(见附件)


您必须确保您的验证器使用相同的约束验证器工厂。或者为什么不将LocalValidatorFactoryBean直接注入测试?如果我理解正确的话,globalconcerontext就是通过编程方式配置bean的地方。为什么不在那里添加LocalValidatoryFactoryBean呢。但是,我不是弹簧专家。

我猜您的问题在于:

@Bean
public Validator createValidatorFactory() {
    return Validation.buildDefaultValidatorFactory().getValidator();
}
这将构建默认的验证器,包括默认的ConstraintValidatorFactory,它不注入SpringBean。如果你查看文档,你会发现

默认情况下,LocalValidatorFactoryBean配置 SpringConstraintValidatorFactory,使用Spring创建 ConstraintValidator实例。这允许您进行自定义 约束验证程序从依赖项注入中获益 其他的春豆

(见附件)


您必须确保您的验证器使用相同的约束验证器工厂。或者为什么不将LocalValidatorFactoryBean直接注入测试?如果我理解正确的话,globalconcerontext就是通过编程方式配置bean的地方。为什么不在那里添加LocalValidatoryFactoryBean呢。但是,我不是Spring专家。

你能不能简化一下代码,这样错误仍然会发生,但我们不必阅读无用的代码。还有一些类可能会影响代码,但我们没有看到它们:GlobalReconText、AbstractTestNGSpringContextTests。谢谢你的回复,马雷克
AbstractTestNGSpringContextTests
是一个SpringTest类。我已经添加了
globalcorontext.java
。你能简化一下代码吗?这样错误仍然会发生,但我们不必阅读无用的代码。还有一些类可能会影响代码,但我们没有看到它们:GlobalReconText、AbstractTestNGSpringContextTests。谢谢你的回复,马雷克
AbstractTestNGSpringContextTests
是一个SpringTest类。我已经添加了
globalcorontext.java
。感谢您将
localvalidatorybean
直接添加到unittest中效果很好。感谢您将
localvalidatorybean
直接添加到unittest中效果很好。