Для идентификатора вида не может быть сохранено состояние сохраненного состояния - после таймаута сеанса / [дублирования]

Здесь я рассматриваю несколько случаев, через которые вы можете очистить концепцию

1. ArrayList<String> arr = new ArrayList<String>();
2. ArrayList<String> arr = new ArrayList();
3. ArrayList arr = new ArrayList<String>();

Случай 1

ArrayList<String> arr является ссылочной переменной ArrayList с типом String, которые ссылаются на объект ArralyList типа String. Это означает, что он может содержать только объект типа String.

Строго для String не для Raw Type, поэтому он никогда не будет предупреждать.

    arr.add("hello");// alone statement will compile successfully and no warning.

    arr.add(23);  //prone to compile time error.
     //error: no suitable method found for add(int)

Случай 2

В этом случае ArrayList<String> arr является строгим типом, но ваш объект new ArrayList(); является сырым типом.

    arr.add("hello"); //alone this compile but raise the warning.
    arr.add(23);  //again prone to compile time error.
    //error: no suitable method found for add(int)

здесь arr является строгим типом. Таким образом, он будет поднимать ошибку времени компиляции при добавлении integer.

Предупреждение: - Объект типа Raw ссылается на тип Strict Referenced Variable ArrayList.

Случай 3

В этом случае ArrayList arr является сырым типом, но ваш Object new ArrayList<String>(); является строгим типом.

    arr.add("hello");  
    arr.add(23);  //compiles fine but raise the warning.

Он добавит в него любой тип объекта, потому что arr является сырым типом.

Внимание: - A Strict Тип Объект ссылается на a raw тип, на который ссылается переменная.

147
задан BalusC 14 November 2013 в 14:32
поделиться

10 ответов

312
ответ дан Community 22 August 2018 в 03:32
поделиться

Вы пытались добавить строки ниже к своему web.xml?

<context-param>
   <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
   <param-value>true</param-value>
</context-param>

Я нашел, что это очень эффективно, когда я столкнулся с этой проблемой.

49
ответ дан Apurv 22 August 2018 в 03:32
поделиться
  • 1
    это сработало и для меня. Спасибо за ответ. Какова цель этого? – MartK 17 May 2012 в 11:56
  • 2
    Не помните точно, но я нашел это решение на веб-сайте ICEFaces. – Mike GH 22 May 2012 в 13:18
  • 3
    я могу немного опоздать на вечеринку, но это сработало и для меня. благодаря! – stellarossa 10 September 2013 в 13:13
  • 4
    Является ли это определено только для JSF 1.2 или JSF 2? – SRy 1 October 2013 в 17:16
  • 5
    Это прекратит бросать исключение, когда время истечения срока действия и просто продолжит запрос, но JSF по-прежнему не сможет восстановить состояние представления или не найти какие-либо связанные с ним компоненты. Эта транзакция будет вести себя как безстоящий JSF, и вам нужно будет восстановить состояние представления самостоятельно на основе параметров запроса POST, чтобы избежать «wtf? & Quot; опыт конечного пользователя при обработке формы submit ответил неожиданно. Если вы хотите применить это только на определенных страницах JSF, скорее используйте OmniFaces <o:enableRestorableView> вместо контекстного параметра приложения. – BalusC 13 August 2015 в 07:16
-2
ответ дан harshal 22 August 2018 в 03:32
поделиться

Я сам столкнулся с этой проблемой и понял, что это связано с побочным эффектом фильтра, который я создал, который фильтрует все запросы на аппликацию. Как только я изменил фильтр, чтобы выбрать только определенные запросы, эта проблема не возникала. Может быть, хорошо проверить такие фильтры в вашем приложении и посмотреть, как они себя ведут.

-2
ответ дан javshak 22 August 2018 в 03:32
поделиться

Я добавлю следующую конфигурацию в web.xml, и она была решена.

<context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>500</param-value>
</context-param>
<context-param>
    <param-name>com.sun.faces.numberOfLogicalViews</param-name>
    <param-value>500</param-value>
</context-param>
-3
ответ дан Mohamed Ali 22 August 2018 в 03:32
поделиться
  • 1
    Ужасный совет. Только делайте это, когда у вас много памяти, и у ваших конечных пользователей действительно есть до 500 вкладок браузера, и нажмите кнопку возврата в браузере до 500 раз до предыдущих синхронных обратных передач. – BalusC 13 August 2015 в 07:11

Вы можете использовать свой собственный обработчик исключений Ajax или perffaces-extensions

Обновить ваши faces-config.xml

...
<factory>
  <exception-handler-factory>org.primefaces.extensions.component.ajaxerrorhandler.AjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
...

Добавить следующий код на странице jsf

...
<pe:ajaxErrorHandler />
...
0
ответ дан myset 22 August 2018 в 03:32
поделиться

Я получал эту ошибку: javax.faces.application.ViewExpiredException.Когда я использую разные запросы, я обнаружил тех, у кого есть тот же JsessionId, даже после перезапуска сервера. Так что это связано с кешем браузера. Просто закройте браузер и попробуйте, он будет работать.

0
ответ дан rahul 22 August 2018 в 03:32
поделиться
  • 1
    Это уже покрывается текущим верхним ответом. – BalusC 13 August 2015 в 07:13

Когда наша страница простаивает в течение x времени, срок действия представления истекает, и бросает javax.faces.application.ViewExpiredException, чтобы это не происходило, одним из решений является создание CustomViewHandler, который расширяет ViewHandler и переопределяет метод restoreView. Все остальные методы делегирован родителям

import java.io.IOException;
import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

public class CustomViewHandler extends ViewHandler {
    private ViewHandler parent;

    public CustomViewHandler(ViewHandler parent) {
        //System.out.println("CustomViewHandler.CustomViewHandler():Parent View Handler:"+parent.getClass());
        this.parent = parent;
    }

    @Override 
    public UIViewRoot restoreView(FacesContext facesContext, String viewId) {
    /**
     * {@link javax.faces.application.ViewExpiredException}. This happens only  when we try to logout from timed out pages.
     */
        UIViewRoot root = null;
        root = parent.restoreView(facesContext, viewId);
        if(root == null) {
            root = createView(facesContext, viewId);
        }
        return root;
    }

    @Override
    public Locale calculateLocale(FacesContext facesContext) {
        return parent.calculateLocale(facesContext);
    }

    @Override
    public String calculateRenderKitId(FacesContext facesContext) {
        String renderKitId = parent.calculateRenderKitId(facesContext);
        //System.out.println("CustomViewHandler.calculateRenderKitId():RenderKitId: "+renderKitId);
        return renderKitId;
    }

    @Override
    public UIViewRoot createView(FacesContext facesContext, String viewId) {
        return parent.createView(facesContext, viewId);
    }

    @Override
    public String getActionURL(FacesContext facesContext, String actionId) {
        return parent.getActionURL(facesContext, actionId);
    }

    @Override
    public String getResourceURL(FacesContext facesContext, String resId) {
        return parent.getResourceURL(facesContext, resId);
    }

    @Override
    public void renderView(FacesContext facesContext, UIViewRoot viewId) throws IOException, FacesException {
        parent.renderView(facesContext, viewId);
    }

    @Override
    public void writeState(FacesContext facesContext) throws IOException {
        parent.writeState(facesContext);
    }

    public ViewHandler getParent() {
        return parent;
    }

}   

Затем вам нужно добавить его в ваши faces-config.xml

<application>
    <view-handler>com.demo.CustomViewHandler</view-handler>
</application>

Спасибо за исходный ответ по ссылке ниже: http://www.gregbugaj.com/?p=164

0
ответ дан ROMANIA_engineer 22 August 2018 в 03:32
поделиться
  • 1
    Этот подход не восстанавливает видимые бобы. – BalusC 21 May 2015 в 21:21

Избегайте многочастных форм в Richfaces:

<h:form enctype="multipart/form-data">
    <a4j:poll id="poll" interval="10000"/>
</h:form>

Если вы используете Richfaces, я обнаружил, что запросы ajax внутри многочастных форм возвращают новый идентификатор просмотра по каждому запросу.

Как отлаживать:

При каждом запросе ajax возвращается идентификатор вида, это нормально, если идентификатор просмотра всегда один и тот же. Если вы получаете новый идентификатор просмотра по каждому запросу, тогда возникает проблема и его необходимо устранить.

3
ответ дан tak3shi 22 August 2018 в 03:32
поделиться

Сначала, что вам нужно сделать, прежде чем менять web.xml, убедитесь, что ваш ManagedBean implements Serializable:

@ManagedBean
@ViewScoped
public class Login implements Serializable {
}

Особенно, если вы используете MyFaces

5
ответ дан ZuzEL 22 August 2018 в 03:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: