2016-02-29 4 views
1

У меня есть проект vaadin, и мне нужно использовать аннотацию @Autowired Spring. Поэтому я использую Vaadin пружинной надстройкуVaadin-spring autowired

<dependency> 
    <groupId>com.vaadin</groupId> 
    <artifactId>vaadin-spring</artifactId> 
    <version>1.0.0</version> 
</dependency> 

Теперь, если я определяю autowired класса в классе UI, он работает правильно. Но если я определяю autowired класс в другом классе, этот класс всегда равен нулю. Например, в этом случае «serv» всегда имеет значение null.

@SuppressWarnings("serial") 
public class ProfileWindow extends Window { 

    @Autowired 
    private Servizio serv; 

    ... 
    ... 

    private Component buildFooter() { 
     HorizontalLayout footer = new HorizontalLayout(); 
     footer.addStyleName(ValoTheme.WINDOW_BOTTOM_TOOLBAR); 
     footer.setWidth(100.0f, Unit.PERCENTAGE); 

     Button ok = new Button("OK"); 
     ok.addStyleName(ValoTheme.BUTTON_PRIMARY); 
     ok.addClickListener(new ClickListener() { 
      @Override 
      public void buttonClick(ClickEvent event) { 
       Dati dd = new Dati(Double.parseDouble(nomeField.getValue()), Double.parseDouble(cognomeField.getValue())); 

       String out = serv.converti(dd); 

       Notification success = new Notification(out); 
       success.setDelayMsec(2000); 
       success.setStyleName("bar success small"); 
       success.setPosition(Position.BOTTOM_CENTER); 
       success.show(Page.getCurrent()); 

       BsciEventBus.post(new ProfileUpdatedEvent()); 
       close(); 


      } 
     }); 
     ok.focus(); 
     footer.addComponent(annulla); 
     footer.setComponentAlignment(annulla, Alignment.TOP_LEFT); 
     footer.addComponent(ok); 
     footer.setComponentAlignment(ok, Alignment.TOP_RIGHT); 

     return footer; 
    } 
} 

ServizioImpl.java

@SpringComponent 
public class ServizioImpl implements Servizio { 

    @Override 
    public String converti(Dati dati) { 

     //implementation... 
     return "out"; 
    } 

} 

Можете ли вы помочь мне использовать autowired annotataion?

У вас есть пример кода для подсказки? Я не понимаю, как решить эту проблему. Если я использую @SpringComponent в своем ProfileWindow, автообновленная аннотация пока не работает.

Благодаря

+0

Spring может autowire поля только в объектах, которые она создает. Он не знает, что вы * вручную создали новый экземпляр. Таким образом, 'ProfileWindow' также должен быть компонентом Spring, и вы должны получить его экземпляр из контекста Spring, чтобы его поля были автообновлены с экземплярами других компонентов. – Morfic

+0

Извините, но если я использую @SpringComponent на 'ProfileWindows', то автоопределение не работает. Есть ли способ определить компонент Servizio в некотором месте, чтобы он мог быть вызван любым классом? Я бы зарегистрировал его в applicationContext.xml – hancock46

+0

Было бы трудно (не невозможно) сделать сервисный bean-компонент * глобально * доступным, но это может быть неправильным. Покажите код после изменений в «ProfileWindow». Как вы получаете экземпляр? Вы используете поле autwired в конструкторе? (P.S. добро пожаловать в SO, при ответе на комментарий кого-то вы можете использовать @username, чтобы они получили уведомление о вашем ответе) – Morfic

ответ

0

Если ваш класс имеет впрыскивается элемент, убедитесь, что сам класс инстанциируется из ApplicationContext. Например, вы можете создать экземпляр с context.getBean(ProfileWindow.class), или сам экземпляр класса является аннотированным членом управляемого класса. Если вы создаете экземпляр класса ProfileWindow с помощью new, тогда механизм впрыска не работает.

0

Спасибо всем, но я решил проблему с помощью Vaadin пружины интеграции надстройки на

<dependency> 
    <groupId>ru.xpoft.vaadin</groupId> 
    <artifactId>spring-vaadin-integration</artifactId> 
    <version>3.2</version> 
</dependency>