Событие CDI не работает с com.vaadin.cdi.ViewScoped - PullRequest
0 голосов
/ 09 июня 2018

Я сейчас играю с 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);
    }
}

1 Ответ

0 голосов
/ 09 июня 2018

CDI События - POJO.Итак, сначала вы должны создать пользовательское событие, такое как MessageEvent, я предполагаю, что вы хотите, чтобы сообщение String содержало данные, и имело методы getMessage () и setMessage () соответственно, а также конструктор с параметром String для сообщения.

Тогда делай

@Inject
private javax.enterprise.event.Event<MessageEvent> messageEvent;
...
messageEvent.fire(new MessageEvent(person.getFirstName() + " " + person.getLastName()));
...

И наблюдай это

public void onMessageReceived(@Observes MessageEvent messageEvent) {
     this.lblMessage.setValue("Hello " + messageEvent.getMessage());
}
...