0

myfaces (2.1.7) から mojarra (2.1.7) に切り替える必要がありました。この後、以下のような例外が至る所で発生しています。

フォームを送信すると、検証エラーが発生します。ここまでは正しいです。フォームを再度送信すると、検証エラーが発生します。ここまでは正しいです。フォームを再度送信すると、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

これをグーグルで検索しましたが、まだ手がかりが見つかりません。

ジョニー

4

2 に答える 2

1

スタック トレースは、PrimeFaces を使用していることを示唆しています。

この問題は古いバージョンの PrimeFaces で既知であり、実際には Mojarra ではなく PrimeFaces のバグです。最新のPrimeFaces バージョンを使用していることを確認してください。現在のところ、PF2 を使用している場合は 2.2.1、PF3 を使用している場合は 3.2 です。

于 2012-05-16T12:29:16.480 に答える
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>

マネージドBean:

@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 に追加された新しい Validator を取得します。
送信ボタンが 3 回続けて押され、検証エラーが発生すると、ArrayIndexOutOfBoundException がスローされます。デバッグを試みたところ、AttachedObjectListHolder#restoreState(FacesContext, Object) 内で例外がスローされていることがわかりました。その後、Eclipse デバッガーがおかしくなりました...

これは JSF のバグだと思います。

コメントを残したかったのですが、まだ許可されていません... :(

于 2014-10-17T08:23:47.140 に答える