У меня есть проект 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, автообновленная аннотация пока не работает.
Благодаря
Spring может autowire поля только в объектах, которые она создает. Он не знает, что вы * вручную создали новый экземпляр. Таким образом, 'ProfileWindow' также должен быть компонентом Spring, и вы должны получить его экземпляр из контекста Spring, чтобы его поля были автообновлены с экземплярами других компонентов. – Morfic
Извините, но если я использую @SpringComponent на 'ProfileWindows', то автоопределение не работает. Есть ли способ определить компонент Servizio в некотором месте, чтобы он мог быть вызван любым классом? Я бы зарегистрировал его в applicationContext.xml – hancock46
Было бы трудно (не невозможно) сделать сервисный bean-компонент * глобально * доступным, но это может быть неправильным. Покажите код после изменений в «ProfileWindow». Как вы получаете экземпляр? Вы используете поле autwired в конструкторе? (P.S. добро пожаловать в SO, при ответе на комментарий кого-то вы можете использовать @username, чтобы они получили уведомление о вашем ответе) – Morfic