2013-07-31 5 views
0

// Мой завод классSpring @Autowired аннотированный значение объекта является нулевым

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

класс

@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(); 
     } 
    } 
} 
// Использование // Мой Validator

:

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

уровень Мой пакет сканирования находится на гораздо более высоком уровне. Что происходит, мой девственникАмерикаВалитатор всегда пуст. Почему @Autowired аннотация не работает.

ответ

5

Ваш текущий подход не будет работать с Spring, так как вы в конечном итоге используете new UserRewardAccountValidatorFactory, чтобы создать экземпляр, который по существу полностью обходит контекст Spring. Возможны два подхода, которые должны быть выполнены:

a. Использование factory-method и использование XML для определения вашего боба:

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

Это по существу возвращает экземпляр, который вы создаете назад как Spring фасоль и должны получить autowired чисто.

b. Использование механизма Java @Configuration на основе:

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

или с), используя @Configurable и AspectJ, то весна впрыснуть даже в тех случаях, которые создаются с помощью 'new' (Я упоминаю об этом только для завершения процесса и потому бороться с этим слух, что Spring не может вводить в классы, которые генерируются 'new' - потому что это неправильно) – Ralph

+0

Если я создаю VirginAmericaValidator, простираюсь от другого абстрактного класса и реализую там интерфейс, это сделает для меня пружинный автоузел? – riship89

+0

Нет, это также не сработает, так как проблема все еще в том, как создается 'UserRewardAccountValidatorFactory', а не в Validator. Вы должны иметь возможность работать с одним из двух вариантов, о которых я говорил. Подход, который упоминал Ральф, также хорош, но для его работы потребуется полное переплетение AspectJ. –

Смежные вопросы