hrishikeshp19
hrishikeshp19

Reputation: 9036

Spring @Autowired annotated object value is null

// My Factory class

@Component
public class UserRewardAccountValidatorFactory {

    @Autowired
    private VirginAmericaValidator virginAmericaValidator;

    private static class SingletonHolder {
        static UserRewardAccountValidatorFactory instance = new UserRewardAccountValidatorFactory();
    }

    public static UserRewardAccountValidatorFactory getInstance() {
        return SingletonHolder.instance;
    }

    private UserRewardAccountValidatorFactory() {}

    public PartnerValidator getPartnerValidator(Partner partner){
            return virginAmericaValidator;
    }
}

// My Validator class

@Service
public class VirginAmericaValidator implements PartnerValidator {

    @Override
    public void validate(String code) throws InvalidCodeException{
        //do some processing if processing fails throw exception
        if (code.equals("bad".toString())){
            throw new InvalidCodeException();
        }
    }
}

//Usage:

    PartnerValidator pv = UserRewardAccountValidatorFactory.getInstance().getPartnerValidator(partner);
    if (pv != null){
        try {
            pv.validate(userRewardAccount);
        } catch (InvalidCodeException e){
            return buildResponse(ResponseStatus.INVALID_USER_REWARD_ACCOUNT, e.getMessage());
        }
    }

My package scan level is at much higher level. Whats happening is my virginAmericaValidator is always empty. Why is @Autowired annotation not working.

Upvotes: 0

Views: 1621

Answers (1)

Biju Kunjummen
Biju Kunjummen

Reputation: 49935

Your current approach will not work with Spring as you are ultimately using new UserRewardAccountValidatorFactory to create the instance which essentially bypasses Spring context altogether. Two approaches that should possibly work are these:

a. Using a factory-method and using xml to define your bean:

<bean class="package.UserRewardAccountValidatorFactory" name="myfactory" factory-method="getInstance"/> 

This will essentially return the instance that you are creating back as a Spring bean and should get autowired cleanly.

b. Using Java @Configuration based mechanism:

@Configuration
public class MyBeanConfiguration {
   @Bean 
   public UserRewardAccountValidatorFactory myFactory() {
       return UserRewardAccountValidatorFactory.getInstance();
   }
}

Upvotes: 5

Related Questions