Я сейчас играю с Vaadin 8.4.2 + CDI.
Я получил простое представление с классом простой модели Person
, который имеет 2 свойства (lastname
и firstname
).У меня есть простое представление (GreetPersonView
) и @ViewScoped
компонент (MessageDisplay
), который вводится в представление.Когда кнопка нажата, событие запускается, и класс MessageDisplay
наблюдает за этим событием, а когда событие запускается, оно отображает простое сообщение (см. Код ниже).Теперь, когда MessageDisplay имеет ViewScoped, Обозреватель не запускается.Когда я изменяю его на UIScoped, он работает.Это предназначено?Это ошибка в Vaadin?
@CDIView(GreetPersonView.VIEWNAME)
public class GreetPersonView extends CustomComponent implements View {
public final static String VIEWNAME = "greetperson";
private Person person;
@Inject
private javax.enterprise.event.Event<String> messageEvent;
@Inject
private MessageDisplay messageDisplay;
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
person = new Person();
VerticalLayout layout = new VerticalLayout();
Binder<Person> binder = new Binder<>();
person.setFirstName("John");
person.setLastName("Doe");
// An input field for editing injected data
TextField firstName = new TextField("First name");
layout.addComponent(firstName);
TextField lastName = new TextField("Last name");
layout.addComponent(lastName);
binder.bind(firstName,
Person::getFirstName,
Person::setFirstName);
binder.bind(lastName,
Person::getLastName,
Person::setLastName);
binder.readBean(person);
Button helloButton = new Button("Say Hello");
layout.addComponent(helloButton);
helloButton.addClickListener(e -> {
try {
binder.writeBean(person);
messageEvent.fire(person.getFirstName() + " " + person.getLastName());
} catch (ValidationException e1) {
Notification.show("Person could not be saved, " +
"please check error messages for each field.");
}
});
layout.addComponents(messageDisplay);
setCompositionRoot(layout);
}
}
@ViewScoped
public class MessageDisplay extends Panel {
private Label lblMessage;
public MessageDisplay() {
lblMessage = new Label("Nothing to show");
setContent(lblMessage);
}
public void onMessageReceived(@Observes String message) {
this.lblMessage.setValue("Hello " + message);
}
}