2010-03-04 4 views
5

Tôi có một ứng dụng rất lớn và tại một số điểm, khi một chuyển hướng có liên quan đến tôi nhận được lỗi lạ này:lạ "Chuỗi index ra khỏi phạm vi: 0" lỗi

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) 

Tôi đã dành hai giờ gỡ lỗi và như vậy, nhưng không tìm thấy bất kỳ đầu mối ... Nó chỉ là lạ vì các bản ghi lỗi không cho biết cái gì rõ ràng ... (mà chuỗi, tài sản có liên quan vv).

Có ai có thể đoán thêm điều gì đó từ stacktrace không?

Cảm ơn.

+0

Không, chúng tôi sẽ cần phải xem mã mà gây ra lỗi này để giúp bạn. –

+0

Khi trang đó được hiển thị, có rất nhiều phương thức của các lớp ở đó. –

Trả lời

14

Hãy kiểm tra những gì ViewHandlerImpl#getActionURL() làm (Mojarra is just open source). Dưới đây là một tóm tắt/tước trích của phương pháp này vì nó là trong cá móm 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(); 
    // ... 

Nói cách khác, thông qua trong viewId là một trống chuỗi thay vì null hoặc / hay con đường bình thường . Người quan sát Mojarra không mong đợi điều đó chút nào, vì thế ngoại lệ thời gian chạy này. Nó có thể là một lỗi trong trình xử lý chế độ xem của Mojarra, nó cũng có thể xử lý các chuỗi rỗng, nhưng nó cũng có thể là một lỗi trong trình xử lý khung nhìn của Ajax4jsf, Facelets hoặc Seam mà nó không bao giờ truyền chuỗi rỗng . Nó cũng có thể là một lỗi trong mã của riêng bạn mà bạn đang thực hiện thực sự chuyển một chuỗi trống làm ID chế độ xem.

Nếu sự cố không nằm trong mã của bạn, tôi sẽ bắt đầu nâng cấp những gì có thể được nâng cấp để xem liệu nó có giải quyết được sự cố hay không. Có thể nó đã được báo cáo trước đây dưới dạng lỗi và được sửa trong bản phát hành mới hơn. Nếu điều đó không hiệu quả, tôi sẽ kiểm tra đường dẫn lớp cho các tệp JAR trùng lặp của các phiên bản khác nhau có thể đã va chạm với nhau.

+0

Cảm ơn BalusC. Tôi đã rõ ràng đặt một chuỗi không rỗng trong viewId và với debug tôi đã kiểm tra gấp đôi: redirect.setViewId (portalConfiguration.getInboxPage()); mà không phải là null và không trống rỗng. –

+0

Tất nhiên .... có tôi đã có một tài sản trên viewId mà tôi chuyển hướng, đó là null !!! Oh ................................. Cảm ơn Balus vì bạn đã trả lời. –

+0

... có quá nhiều hy vọng ai đó sẽ cập nhật nguồn Mojarra để xử lý vụ việc này không? –

3

đoán đầu tiên của tôi sẽ được rằng bạn có một chuỗi rỗng "", trong đó bạn đang cố gắng để có được những ký tự đầu tiên (tại index 0)

+0

Tại sao lại là downvote? – Jorn

+0

Chuỗi rỗng không có bất kỳ vấn đề nào đối với thuộc tính 'văn bản' nhưng nếu chúng tôi sử dụng chuỗi trống trong thuộc tính khác như 'inputType' thì vấn đề sẽ xảy ra. –

0

Trong trường hợp của tôi, tôi đã giải quyết được issure xem xét tất cả id của trang của tôi. Tôi đã render một facelet trong hai trường hợp và một trong số đó là một tham chiếu tới một id không tồn tại.

Trong bộ mặt jsf của tôi: Tham chiếu đến # {finishBtn} không tồn tại vì nó không được chuyển từ trang được gọi là này.

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

Tôi đã giải quyết với một đánh giá trước

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