2010-03-04 6 views
5

ich eine große Anwendung haben und an einem gewissen Punkt, wenn eine Umleitung beteiligt erhielt ich dieses seltsame Fehler:seltsam „String-Index außerhalb des Bereichs: 0“ Fehler

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) 

ich 2 Stunden Debuggen ausgegeben haben und so weiter, aber habe keine Ahnung gefunden ... Es ist einfach komisch, weil das Fehlerprotokoll nichts klar macht ... (welche Zeichenfolge, welche Eigenschaft usw.).

Kann jemand etwas mehr vom Stacktrace erraten?

Danke.

+0

Nein, wir müssen den Code sehen, die diesen Fehler verursacht, Ihnen zu helfen. –

+0

Wenn diese Seite gerendert wird, gibt es dort viele Klassenmethoden. –

Antwort

14

Lassen Sie uns prüfen, was ViewHandlerImpl#getActionURL() tut (Mojarra is just open source). Hier ist ein zusammengefasst/beraubt Extrakt des Verfahrens, wie es in 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(); 
    // ... 

Mit anderen Worten, die übergebene in viewId sind ein leerer String statt null oder / oder der normale Weg . Der Mojarra Viewhandler hat es überhaupt nicht erwartet, daher diese Laufzeitausnahme. Es kann ein Fehler im Ansichts-Handler von Mojarra sein, dass es auch leere Zeichenfolgen behandeln sollte, aber es kann auch ein Fehler in dem Ansichtshandler von entweder Ajax4jsf, Facelets oder Seam sein, dass es nie eine leere Zeichenfolge nach oben übergeben sollte . Es kann auch ein Fehler in Ihrem eigenen Code sein, dass Sie tatsächlich übergeben eine leere Zeichenfolge als Ansichts-ID.

Wenn das Problem nicht in Ihrem Code ist, dann würde ich mit dem Upgrade beginnen, was aktualisiert werden kann, um zu sehen, ob es das Problem behebt. Vielleicht wurde es bereits zuvor als Bug gemeldet und in einer neueren Version behoben. Wenn das nicht hilft, würde ich den Klassenpfad nach doppelten JAR-Dateien verschiedener Versionen durchsuchen, die möglicherweise miteinander kollidiert sind.

+0

Danke BalusC. Ich habe klar eine nicht leere Zeichenfolge in der ViewId und mit Debug habe ich doppelt überprüft: redirect.setViewId (portalConfiguration.getInboxPage()); was ist nicht null und nicht leer .... –

+0

Natürlich .... da hatte ich eine Eigenschaft auf dieser ViewId, auf die ich Redirect, die Null war !!! Oh ................................. Danke Balus für dich. –

+0

... ist es zu viel, um zu hoffen, dass jemand die Mojarra-Quelle aktualisiert, um diesen Fall zu behandeln? –

3

Meine erste Vermutung wäre, dass Sie eine leere Zeichenfolge haben "", von denen Sie das erste Zeichen zu bekommen versuchen (bei Index 0)

+0

Warum der Downvote? – Jorn

+0

Empty String hat kein Problem für die 'text'-Eigenschaft, aber wenn wir eine leere Zeichenfolge in einer anderen Eigenschaft wie' inputType 'verwenden, tritt ein Problem auf. –

0

In meinem Fall habe ich den Issure-Bericht über alle IDs meiner Seite gelöst. Ich habe ein Facelet in zwei Fällen gerendert und in einem dieser Fälle gab es einen Verweis auf eine ID, die nicht existierte.

In meiner JSF-Facelet: Der Verweis auf # {finishBtn} nicht vorhanden, weil es nicht von der Seite, die dies aufgerufen wurde, übergeben wurde.

<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> 

ich mit einer früheren Auswertung gelöst haben

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