Этот вопрос в основном направлен на команду разработчиков PrimeFaces, но, возможно, кто-то знает обходной путь.Я не могу загрузить скриншоты на форумах поддержки PrimeFaces, но могу сослаться на свой вопрос здесь.
Отмечено на форумах поддержки PrimeFaces: http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=14022
В моем веб-приложении <p:tree>
установлен режим selection="single"
.Выбор узла работает нормально, когда <p:tree>
не находится внутри <p:dialog>
, как показано здесь:
Однако, когда <p:tree>
находится внутри диалога, возникает исключениевыбрасывается на стороне сервера при каждом нажатии на узел в браузере.Выбор никогда не регистрируется в компоненте поддержки:
Следующая трассировка стека появляется в журналах моего сервера один раз при каждом нажатии пользователем узла дерева в браузере:
27-Jul-2011 3:21:52 PM com.sun.faces.context.PartialViewContextImpl processPartial
INFO: java.lang.NullPointerException
java.lang.NullPointerException
at org.primefaces.component.tree.TreeRenderer.decode(TreeRenderer.java:53)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)
at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1181)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:506)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1589)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at javax.faces.component.UIForm.visitTree(UIForm.java:344)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:931)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Вот неправильный метод PrimeFaces:
@Override
public void decode(FacesContext context, UIComponent component) {
Tree tree = (Tree) component;
Map<String,String> params = context.getExternalContext().getRequestParameterMap();
String clientId = tree.getClientId(context);
TreeModel model = new TreeModel((TreeNode) tree.getValue());
if(tree.getSelectionMode() != null) {
String selection = params.get(clientId + "_selection");
String instantUnselection = params.get(clientId + "_instantUnselection");
boolean isSingle = tree.getSelectionMode().equalsIgnoreCase("single");
if(selection.equals("")) {
if(isSingle)
tree.setSelection(null);
else
tree.setSelection(new TreeNode[0]);
}
else {
String[] selectedRowKeys = selection.split(",");
if(isSingle) {
TreeNode selectedNode = treeExplorer.findTreeNode(selectedRowKeys[0], model);
tree.setSelection(selectedNode);
}
else {
TreeNode[] selectedNodes = new TreeNode[selectedRowKeys.length];
for(int i = 0 ; i < selectedRowKeys.length; i++) {
selectedNodes[i] = treeExplorer.findTreeNode(selectedRowKeys[i], model);
model.setRowIndex(-1); //reset
}
tree.setSelection(selectedNodes);
}
}
}
decodeBehaviors(context, component);
}
Строка, вызывающая исключение, выглядит следующим образом:
if(selection.equals("")) {
В случае, когда <p:tree>
находится внутри <p:dialog>
значение selection
всегда null
.
Есть идеи, как обойти эту проблему?
Я используюсегодняшняя ночная сборка PF 3.0-M3-SNAPSHOT.То же самое происходит с PF 3.0-M2.Демонстрирует одинаковое поведение в IE 7 и Firefox 4.0.1.