ShaggyInjun
ShaggyInjun

Reputation: 2963

Spring won't inject a JPARepository bean

Dao

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

Validator

@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

@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());
    }


}

I have the Dao listed above. This same dao bean gets injected in an @Service annotated class but not in @Component annotated Validator class. Well, not exactly the upon server startup I can see that the setter method gets called, but when I try to use this variable in a method the variable shows as null.

Does anybody see a problem with my configuration ? Please note that the loginDao bean gets injected into a service class, so the Context configuration is good.

Upvotes: 3

Views: 471

Answers (1)

Sotirios Delimanolis
Sotirios Delimanolis

Reputation: 279970

Well there's your problem

webDataBinder.setValidator(new PasswordChangeValidator());

Spring can only manage beans it created. Here, you're creating the instance. Instead inject your bean into the @Controller and use it.

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

Upvotes: 3

Related Questions