2012-05-16 40 views
0

我被迫从myfaces(2.1.7)切换到mojarra(2.1.7)。在此之后,我收到了这样一个例外情况。从myfaces切换到mojarra后发生IndexOutOfBoundsException

我正在提交表单,这给我验证错误。到目前为止这是正确的。我再次提交表单,这给我验证错误。到目前为止这是正确的。现在我再次提交表单,并得到IndexOutOfBoundsException。

javax.faces.FacesException: Unexpected error restoring state for component with id someForm:someField. Cause: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1. 
    at com.sun.faces.application.view.StateManagementStrategyImpl$2.visit(StateManagementStrategyImpl.java:272) 
    at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1612) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:251) 
    at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:188) 
    at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:453) 
    at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:142) 
    at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303) 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:192) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 
    at java.util.ArrayList.RangeCheck(ArrayList.java:547) 
    at java.util.ArrayList.get(ArrayList.java:322) 
    at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165) 
    at javax.faces.component.UIInput.restoreState(UIInput.java:1411) 
    at com.sun.faces.application.view.StateManagementStrategyImpl$2.visit(StateManagementStrategyImpl.java:264) 
    ... 35 more 

我用google搜索了这个,但还没有找到任何线索呢。

Jonny

回答

1

stacktrace暗示您正在使用PrimeFaces。

此问题在PrimeFaces的旧版本中已知,实际上是PrimeFaces中的一个错误,而不是在Mojarra中。确保您使用的是PrimeFaces版本。到目前为止,当您使用PF2时为2.2.1,或者当您使用PF3时为3.2。

+0

嗨BalusC,感谢您的quichk答复。我看到了这个问题,但我不认为它这一点。我使用PF3.2我缩小了它,当我使用''就像这样'' \t \t '我正在运行进入这个错误。删除禁用验证的东西_solves_它。我很困惑。 – user871611

+0

昨天我遇到了同样的问题,并且不得不搜索很长一段时间解决这个问题。我希望人们在需要的时候找到这个页面,因为问题是由validateBean组件引起的。不需要删除标签,但在进入另一个转换之前,您需要刷新页面。一种方法是将“ajax ='false'”添加到提交表单的命令按钮中。希望这将有助于未来的人:) – devnomore

0

我有完全相同的问题,很容易重现。
你可以用下面的类重现:

验证:

@FacesValidator("testValidator") 
public class TestValidator implements Validator { 

    @Override 
    public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException { 
     if (!(o instanceof Integer)) { 
      throw new ValidatorException(new FacesMessage("validation message!")); 
     } 
    } 
} 

FacesComponent:

@ListenerFor(systemEventClass = PreValidateEvent.class) 
@FacesComponent("testField") 
public class TestField extends UIComponentBase implements NamingContainer { 

@Override 
public String getFamily() { 
    return UINamingContainer.COMPONENT_FAMILY; 
} 

@Override 
public void processEvent(ComponentSystemEvent event) throws AbortProcessingException { 
    super.processEvent(event); 
    UIComponent findComponent = findComponent("input"); 
    if (findComponent instanceof UIInput) { 
     UIInput i = (UIInput) findComponent; 
     boolean notFound = true; 
     for (Validator v : i.getValidators()) { 
      if (v instanceof TestValidator) { 
       notFound = false; 
      } 
     } 
     if (notFound) { 
      i.addValidator(new TestValidator()); 
     } 
    } 
} 

} 

自定义组件:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:cc="http://java.sun.com/jsf/composite"> 

    <!-- INTERFACE --> 
    <cc:interface componentType="testField"> 
    </cc:interface> 

    <!-- IMPLEMENTATION --> 
    <cc:implementation> 
     field: <h:inputText id="input" value="#{testController.inputText}" /> 
    </cc:implementation> 
</html> 

ManagedBean:

@SessionScoped 
@Named("testController") 
public class TestController implements Serializable { 

private static final long serialVersionUID = 1L; 

private String inputText = ""; 

public TestController() { 
} 

public void actionListener(ActionEvent event) { 

} 

public String myAction() { 
    return ""; 
} 

public String getInputText() { 
    return inputText; 
} 

public void setInputText(String inputText) { 
    this.inputText = inputText; 
} 

} 

的index.xhtml

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:t="http://java.sun.com/jsf/composite/test" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://xmlns.jcp.org/jsf/html"> 
    <h:head> 
     <title>Jsf Problem</title> 
    </h:head> 
    <h:body> 
     <h:form>  
      <h:messages /> 
      <t:field /> 
      <h:commandButton value="Submit" action="#{testController.myAction()}" /> 
     </h:form> 
    </h:body> 
</html> 

定制组件字段内的的inputText得到一个新的验证添加在的processEvent()方法内PreValidateEvent。
如果提交按钮现在连续按下三次并出现验证错误,则抛出ArrayIndexOutOfBoundException异常。我试图调试,发现这个异常抛在了AttachedObjectListHolder#restoreState(FacesContext,Object)里面,之后我的eclipse调试器变得疯狂了......

我觉得这是一个JSF Bug!

我想发表评论,但我'不许尚未... :(