Spring无法注入JPARepository bean

3

Dao

@Repository
public interface LoginDao extends JpaRepository<Login, Integer> {
    Login findByLogin(String login);
}

验证器

@Component
public class PasswordChangeValidator implements Validator {

private LoginDao loginDao;

@Override
public boolean supports(Class<?> aClass) {
    return PasswordChange.class.equals(aClass);
}

@Override
public void validate(Object o, Errors errors) {

    PasswordChange passwordChange = (PasswordChange) o;

            **// There is a null pointer here because loginDao is null** 
    Login login = loginDao.findByLogin(passwordChange.getLoginKey());


}

public LoginDao getLoginDao() {
    return loginDao;
}

@Autowired
public void setLoginDao(LoginDao loginDao) {
    **// There is a debug point on the next line and it's hit on server startup and I can
    // see the parameter us non-null** 
    this.loginDao = loginDao;
}
}

控制器

@Controller
@RequestMapping("api")
public class PasswordController {

    @Autowired
    PasswordService passwordService;

    @InitBinder("passwordChange")
    public void initBinder(WebDataBinder webDataBinder, WebRequest webRequest) {
        webDataBinder.setValidator(new PasswordChangeValidator());
    }   

    @RequestMapping(value = "/passwordChange", method = RequestMethod.POST)
    public @ResponseBody PasswordInfo passwordInfo(@RequestBody @Valid PasswordChange passwordChange)
            throws PasswordChangeException {
        return passwordService.changePassword(passwordChange.getLoginKey(), passwordChange.getOldPassword(), passwordChange.getNewPassword());
    }


}

我有上面列出的Dao。这个同样的Dao bean被注入到一个@Service注解的类中,但不是在@Component注解的验证器类中。好吧,不完全是这样,在服务器启动时,我可以看到setter方法被调用,但当我尝试在方法中使用这个变量时,变量显示为null。

有人看到我的配置有问题吗?请注意,loginDao bean被注入到一个service类中,所以上下文配置是正确的。


你在哪里尝试使用 PasswordChangeValidator?Spring 无法注入 null。你可能是自己创建了实例。 - Sotirios Delimanolis
在控制器方法中使用@Valid注释。我正在使用控制器内的@InitBinder注释绑定验证器。我不是说它注入了null,只是当它不应该时,loginDao为空。 - ShaggyInjun
展示带有@InitBinder的代码给我们看。 - Sotirios Delimanolis
添加了控制器代码。 - ShaggyInjun
1个回答

3
嗯,问题就在这里。
webDataBinder.setValidator(new PasswordChangeValidator());

Spring只能管理它创建的bean。在这里,你正在创建实例。相反,将你的bean注入到@Controller中并使用它。

@Inject
private PasswordChangeValidator passwordChangeValidator;
...
webDataBinder.setValidator(passwordChangeValidator);

太棒了,就在我眼前,感谢你的帮助。 - ShaggyInjun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接