2010-03-04 5 views
5

J'ai une énorme demande et à un moment donné, quand une redirection est impliqué i reçu cette erreur étrange:étrange « index de chaîne hors de portée: 0 » Erreur

Caused by java.lang.StringIndexOutOfBoundsException with message: "String index out of range: 0"  
java.lang.String.charAt(String.java:687) 
com.sun.faces.application.ViewHandlerImpl.getActionURL(ViewHandlerImpl.java:652) 
org.jboss.seam.jsf.SeamViewHandler.getActionURL(SeamViewHandler.java:74) 
com.sun.facelets.FaceletViewHandler.getActionURL(FaceletViewHandler.java:803) 
org.ajax4jsf.application.ViewHandlerWrapper.getActionURL(ViewHandlerWrapper.java:86) 
org.jboss.seam.ui.util.ViewUrlBuilder.<init>(ViewUrlBuilder.java:25) 
org.jboss.seam.ui.component.UISeamCommandBase.getUrl(UISeamCommandBase.java:48) 
org.jboss.seam.ui.renderkit.LinkRendererBase.doEncodeBegin(LinkRendererBase.java:26) 
org.jboss.seam.ui.util.cdk.RendererBase.encodeBegin(RendererBase.java:79) 
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:813) 
javax.faces.component.UIComponent.encodeAll(UIComponent.java:934) 
javax.faces.component.UIComponent.encodeAll(UIComponent.java:942) 
javax.faces.component.UIComponent.encodeAll(UIComponent.java:942) 
com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592) 
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100) 
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176) 
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109) 
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) 
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) 
org.jboss.seam.web.RewriteFilter.doFilter(RewriteFilter.java:63) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73) 
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) 
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 
org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432) 
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) 
java.lang.Thread.run(Thread.java:619) 

J'ai passé deux heures de débogage et ainsi de suite, mais n'a trouvé aucune idée ... C'est juste bizarre parce que le journal d'erreur ne dit pas quelque chose de clair ... (quelle chaîne, quelle propriété est impliquée etc.).

Quelqu'un peut-il deviner quelque chose de plus à partir de la pile?

Merci.

+0

Non, nous devons voir le code qui a provoqué cette erreur pour vous aider. –

+0

Lorsque cette page est rendue, il y a beaucoup de méthodes de classes. –

Répondre

14

Voyons ce que ViewHandlerImpl#getActionURL() fait (Mojarra is just open source). Voici un extrait est résumé/dépouillé de la méthode telle qu'elle est en Mojarra 2.0.2:

public String getActionURL(FacesContext context, String viewId) { 
    if (context == null) throw new NullPointerException(); 
    if (viewId == null) throw new NullPointerException(); 
    if (viewId.charAt(0) != '/') throw new IllegalArgumentException(); 
    // ... 

En d'autres termes, le passé en viewId est une chaîne vide au lieu de null ou / ou la voie normale . Le viewhandler de Mojarra ne l'attendait pas du tout, d'où cette exception d'exécution. Il peut être un bug dans le gestionnaire de vue de Mojarra qui devrait aussi gérer les chaînes vides, mais cela peut aussi être un bug dans le gestionnaire de vue de Ajax4jsf, Facelets ou Seam qu'il ne devrait jamais passer une chaîne vide . Il peut aussi être un bug dans votre propre code que vous êtes réellement en passant une chaîne vide comme ID de vue. Si le problème n'est pas dans votre code, alors je commencerais par mettre à jour ce qui peut être mis à jour pour voir s'il résout le problème. Peut-être qu'il a déjà été signalé auparavant comme un bug et corrigé dans une version plus récente. Si cela ne vous aide pas, je vérifierais le classpath pour les fichiers JAR en double de différentes versions qui pourraient être entrés en collision les uns avec les autres.

+0

Merci BalusC. J'ai clairement mis une chaîne non vide dans le viewId et avec le débogage j'ai vérifié deux fois: redirect.setViewId (portalConfiguration.getInboxPage()); ce qui n'est pas nul et non vide .... –

+0

Bien sûr .... là j'ai eu une propriété sur ce point de vue auquel je redirige, ce qui était nul !!! Oh ................................. Merci Balus pour votre réponse. –

+0

... est-ce trop d'espérer que quelqu'un va mettre à jour la source de Mojarra pour gérer ce cas? –

3

Ma première hypothèse serait que vous avez une chaîne vide "", dont vous essayez d'obtenir le premier caractère (indice 0)

+0

Pourquoi la downvote? – Jorn

+0

Chaîne vide n'a aucun problème pour la propriété 'text' mais si nous utilisons une chaîne vide dans une autre propriété comme 'inputType' alors un problème se produira. –

0

Dans mon cas, j'ai résolu l'édition en examinant toutes les identifications de mes pages. Je rendais un facelet dans deux cas et dans l'un d'eux il y avait une référence à un identifiant qui n'existait pas.

Dans ma facette jsf: La référence à # {finishBtn} n'existait pas car elle n'était pas passée depuis la page qui l'appelait.

<ui:composition> 
    ...... 
    .... 
    <a4j:commandButton title="#{i18n.editar_er_tip}" 
         image="/images/edit.png" style="width:16px;height:16px" reRender="entregablesTable,#{finishBtn},entregableBotton" 
         action="#{actionBean[editMethod]}" 
         onclick="Richfaces.showModalPanel('waitPanel')" 
         oncomplete="Richfaces.hideModalPanel('waitPanel');Richfaces.showModalPanel('entregableBotton')"> 
    </a4j:commandButton> 
    .... 
    .. 
</ui:composition> 

J'ai résolu avec une évaluation précédente

<c:if test="${empty finishBtn}"> 
     <c:set var="finishBtn" value="editButton" /> 
</c:if> 
Questions connexes