Возможно ли обновить JSF-компонент от слушателя Cometd поддержки Бина?

Может ли прослушиватель cometd вызывать "RequestContext.getCurrentInstance ()"?

sayHello () может работать, но addRow() не работает.

Кажется, RequestContext не может получить текущий экземпляр или я на неправильном пути? (Org.primefaces.context.RequestContext)

Спасибо.

Вот вывод:

Бин получил сообщение: 2

готов к получению текущего экземпляра

org.cometd.bayeux.client.ClientSession - Исключительная ситуация при вызове bean-компонента слушателя. AlarmBean$NodeLsnr@7e33d20f

java.lang.NullPointerException в bean.AlarmBean.addRow(AlarmBean.java:48) в bean.AlarmBean$NodeLsnr.onMessage(AlarmBean.java:57) в

org.cometd.common.AbstractClientSession$AbstractSessionChannel.notifyOnMessage(AbstractClientSession.java:432)

Код:

@Named("AlarmBean")
@ViewScoped
public class AlarmBean implements Serializable {

private String defaultURL = "http://localhost:31360/topoServer/cometd/foo";
private BayeuxClient client;
private static final String NODE_CHANNEL = "/node";
private NodeLsnr NL = new NodeLsnr();
private int i = 1;

@PostConstruct
public void initComted(){
    initClient();
}

public void sayHello() {
    i++;
    System.out.println("Bean received Msg : " + Integer.toString(i));
}

public void addRow() {          
    System.out.println("ready to getCurrentInstance");
    RequestContext.getCurrentInstance().update("f1:table1");
}

private class NodeLsnr implements ClientSessionChannel.MessageListener {
    @Override
    public void onMessage(ClientSessionChannel csc, Message msg) {
        System.out.println("data received ");
        sayHello();
        addRow();
    }
}

public void initClient() {
    HttpClient httpClient = new HttpClient();
    try {
        httpClient.start();
    } catch (Exception ex) {           
        return;
    }

    Map<String, Object> options = new HashMap<>();
    ClientTransport longPool = LongPollingTransport.create(options, httpClient);
    client = new BayeuxClient(defaultURL, longPool);
    client.handshake();
    boolean handshaken = client.waitFor(10000, BayeuxClient.State.CONNECTED);
    if (handshaken) {
        System.out.println("connected ok");
        client.getChannel("/node").subscribe(NL);
        System.out.println("subscribe to /node channel.");
    }

}

}

0 ответов

Другие вопросы по тегам