[Primefaces] Autocomplete sur session expirée : NullPointerException malgré une vue restaurée.
Bonjour,
Un utilisateur utilise une combo-box Primefaces en autocomplete.
Code:
1 2 3 4 5 6
| <p:autoComplete id="listeCommunes" styleClass="combo" dropdown="true" maxlength="70"
var="commune" itemValue="#{commune.codeCommune}" itemLabel="#{commune == null ? '' : geographie.presentationVille(commune)}"
value="#{accueil.codeCommune}" converter="codeCommuneConverter"
completeMethod="#{geographie.autoCompleteCommune}">
<p:ajax event="itemSelect" process="@form" update=":carteForm :accrocheContourForm :accrocheNomCommuneForm :imageBackgroundCommuneForm" />
</p:autoComplete> |
Parce qu'il délaisse l'application un certain temps ensuite, la session tombe. Et plus tard, il entreprend de faire sur la page où il est une nouvelle sélection dans cette même combo-box. Il ignore bien sûr que la session est tombée.
Un errorHandler s'enclenche :
Code:
1 2 3 4 5 6
| if (t instanceof ViewExpiredException)
{
fc.setViewRoot(fc.getApplication().getViewHandler().createView(fc, "/index.xhtml"));
fc.getPartialViewContext().setRenderAll(true);
fc.renderResponse();
} |
dont j'espère qu'avec mes managed beans sérialisables et le partial state saving que j'ai mis dans mon web.xml, l'application parviendra à restaurer la session que je m'autorise à réactiver à loisir tant que l'internaute n'est pas authentifié, c'est à dire qu'il est un simple visiteur.
Code:
1 2 3 4
| <context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>true</param-value>
</context-param> |
Mais cela ne suffit pas : mon application échoue en NullPointerException au moment où l'utilisateur entreprend une nouvelle sélection :
Code:
1 2 3 4 5 6 7 8
| 18-Apr-2016 09:05:18.210 SEVERE [http-nio-8080-exec-22] com.sun.faces.application.view.FaceletViewHandlingStrategy.handleRenderException Error Rendering View[/index.xhtml]
java.lang.NullPointerException
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSuggestionsAsList(AutoCompleteRenderer.java:516)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSuggestions(AutoCompleteRenderer.java:411)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeResults(AutoCompleteRenderer.java:122)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeEnd(AutoCompleteRenderer.java:104)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:924)
[...] |
Un grepcode sur le composant AutoCompleteRenderer.java de Primefaces m'indique cet emplacement comme origine du NullPointerException, et c'est plausible :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| protected void encodeSuggestionsAsList(FacesContext context, AutoComplete ac, List items, Converter converter) throws IOException {
ResponseWriter writer = context.getResponseWriter();
String var = ac.getVar();
Map<String,Object> requestMap = context.getExternalContext().getRequestMap();
boolean pojo = var != null;
UIComponent itemtip = ac.getFacet("itemtip");
boolean hasGroupByTooltip = (ac.getValueExpression("groupByTooltip") != null);
writer.startElement("ul", ac);
writer.writeAttribute("class", AutoComplete.LIST_CLASS, null);
for(Object item : items) {
writer.startElement("li", null);
writer.writeAttribute("class", AutoComplete.ITEM_CLASS, null); |
Avez-vous des suggestions à me faire pour résoudre ce problème ?