0

// 私のファクトリークラス

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

// 私の Validator クラス

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

//使用法:

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

私のパッケージ スキャン レベルは、はるかに高いレベルです。何が起こっているのかというと、virginAmericaValidator は常に空です。@Autowired アノテーションが機能しないのはなぜですか。

4

1 に答える 1

5

new UserRewardAccountValidatorFactory基本的にSpringコンテキストを完全にバイパスするインスタンスを作成するために最終的に使用しているため、現在のアプローチはSpringでは機能しません。おそらくうまくいくはずの2つのアプローチは次のとおりです。

を。afactory-methodと xml を使用して Bean を定義します。

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

これは基本的に、Spring Bean として作成しているインスタンスを返し、きれいに自動配線されるはずです。

b. Java@Configurationベースのメカニズムの使用:

@Configuration
public class MyBeanConfiguration {
   @Bean 
   public UserRewardAccountValidatorFactory myFactory() {
       return UserRewardAccountValidatorFactory.getInstance();
   }
}
于 2013-07-31T01:14:17.447 に答える