Jsf 原始浏览器中未接收到推送事件
我有一个primefaces数据网格,我正在尝试使用primefaces Push更新它。我可以看到onMessage方法被调用,但是组件本身只有在我在onMessage方法中设置了断点时才会更新。这是处理程序:Jsf 原始浏览器中未接收到推送事件,jsf,jsf-2,primefaces,primefaces-push,Jsf,Jsf 2,Primefaces,Primefaces Push,我有一个primefaces数据网格,我正在尝试使用primefaces Push更新它。我可以看到onMessage方法被调用,但是组件本身只有在我在onMessage方法中设置了断点时才会更新。这是处理程序: @PushEndpoint("/prices") public class PricesResource { private static final Logger logger = Logger.getLogger("PricesResource"); @OnMe
@PushEndpoint("/prices")
public class PricesResource {
private static final Logger logger = Logger.getLogger("PricesResource");
@OnMessage(encoders = {JSONEncoder.class})
public OrderBook onMessage(OrderBook orderBook) throws InterruptedException {
logger.log(Level.INFO, "PricesResource.onMessage price {0}", orderBook.getPrice());
return orderBook;
}
}
这是我为更新index.xhtml中的组件而调用的代码:
<p:socket onMessage="handleMessage" channel="/prices" />
<script type="text/javascript">
function handleMessage(data)
{
updateWidgets();
}
</script>
<p:remoteCommand name="updateWidgets"
actionListener="#{parliamentManager.findLatestPrices}"
update="resultDisplay"/>
函数句柄消息(数据)
{
updateWidgets();
}
此时组件正好位于index.xhtml的底部:
<h:panelGroup id="resultDisplay">
<p:dataGrid id="prices" var="orderBooks" value="#{parliamentManager.latestPricesResults}" columns="3" rows="12">
<p:column>
<p:panel header="#{orderBooks.bidOrderId.member.memberId}">
<h:panelGrid columns="1">
<h:outputText value="#{orderBooks.price}" />
</h:panelGrid>
</p:panel>
</p:column>
</p:dataGrid>
</h:panelGroup>
我很难理解为什么会这样,如果有任何建议,我将不胜感激。我发现解决方案是将自动运行属性添加到我的remoteCommand标记中,这将在提交表单和重新加载页面后更新组件
<p:remoteCommand name="updateWidgets"
actionListener="#{parliamentManager.findLatestPrices}"
update="resultDisplay"
autoRun="true"/>
我假设您使用浏览器开发工具“调试”了所有网络流量?检查“更新”属性等值的正确性?@Kukeltje我会尝试一下,但我不确定我在寻找什么。是否执行了远程命令,其响应是什么样的(例如,已更新但使用相同的数据),响应中的任何错误,是否调用了方法等。@Kukeltje执行了远程命令,是的。我不确定它是否更新了相同的数据。我注意到的一件有趣的事情是,如果我打开两个浏览器并更新我的列表(即更改最新价格结果),它将在另一个浏览器窗口中持续更新组件,但不会更新它自己的组件。我不确定这表明了什么。我已经在javascript处理程序中添加了日志记录,我可以看到处理程序正在启动,并且在接收浏览器中具有正确的数据(尽管我不使用返回给处理程序的对象)。我还可以看到提交表单的浏览器中没有触发处理程序(假设我们使用两个浏览器),所以这仍然有点神秘。奇怪的解决方案。那么你肯定在某个地方遇到了不同的问题,或者你没有发布的相关代码!