продолжайте получать javax.faces.application.ViewExpiredException: viewId с jsf 2

Что бы я ни делал, я получаю javax.faces.application.ViewExpiredException: viewId. Я знаю, как обработать исключение (снова перенаправить на главную страницу, если я получу ошибку), проблема в том, что любое действие, которое я вызываю из commandButton, не выполняется.

В основном у меня есть простое представление с commandButton с действием. Я нажимаю его, и я получаю viewExpiredException или, если я обрабатываю ошибку, я не получаю сообщения об ошибках, но мой commandButton все еще не работает.

Я попытался добавить это:

 <context-param>
     <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
     <param-value>client</param-value>
 </context-param>

но это не работает. Я не знаю, что происходит..

Это мой взгляд:

<?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:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    lang="es">
<div class="container">
    <h:form id="principal">
        <h1>Sistema de carga de publicaciones</h1>

        <h:outputText value="Ingrese el año por el que desea buscar publicaciones" />
        <h:inputText
            id="year"
            value="#{publicaciones.año}" />

        <h:commandButton
            style="display:block"
            id="boton-codigo-facultad"
            value="Buscar"
            type="submit">
        </h:commandButton>

        <h:panelGroup id="output">
            <h:outputText
                style="display:block"
                value="Total publicaciones en la DB:#{publicaciones.totalPublicacionesDB}" />
            <h:outputText
                style="display:block"
                value="Publicaciones obtenidas desde el WS:" />
            <h:outputText
                style="display:block"
                value="Publicaciones nuevas:" />
        </h:panelGroup>
        <h:commandButton
            style="display:block"
            id="insertar"
            value="Cargar publicacion"
            action="#{insert.insertPublicacionDB}">
        </h:commandButton>
    </h:form>
</div>
</html>

поддерживающая фасоль:

@ManagedBean(name="insert")
@ViewScoped
public class comparaDatosBean implements Serializable {

    private static final long serialVersionUID = 1L;
    Map<String, Object> parametros=new HashMap<String, Object>();
    Map<String, Object> params2=new HashMap<String, Object>();

    @PostConstruct
    public void init(){
        System.out.println("pase por aqui!!");
    }

    public void insertPublicacionDB() throws SQLException {
        ApplicationContext applicationContext = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
        ControllerPublicacion controlador= (ControllerPublicacion) applicationContext.getBean("controllerPublicaciones");
        parametros.put("ut","234567876545555");
        parametros.put("py", 2013);

        params2.put("ut", "234567876545555");
        params2.put("bp","asjñldfkjsñd");
        params2.put("la", "Español");
        params2.put("ti","Publicacion de prueba");
        params2.put("py",2013);
        params2.put("sn", "234wf");
        params2.put("di", "asdfsf");
        params2.put("j9", "");
        params2.put("dt", "");
        params2.put("ga", "");
        params2.put("dt", "");
        params2.put("so", "");
        params2.put("fx", "");
        params2.put("ep", "");
        params2.put("issue", "");
        params2.put("parte","");
        params2.put("vl", "");
        params2.put("rp", "");
        params2.put("vinculada", null);
        params2.put("ji", "");
        params2.put("pd","");
        params2.put("pg", "");
        params2.put("pa","");
        params2.put("ab","");
        params2.put("pi", "");
        params2.put("numero_articulo", null);
        params2.put("tipo_carga_revista",null);
        params2.put("id",null );
        params2.put("su", "");
        System.out.println(params2.get("la"));
        if(controlador.existeEnDB(parametros)>0){
            System.out.println("La publicacion ya existe en la Base de Datos");
        } else {
            controlador.insertPublicacion(params2);
            System.out.println("la publicacion ha sido añadida");
        }

    }

    public Map<String, Object> getParametros() {
        return parametros;
    }

    public void setParametros(Map<String, Object> parametros) {
        this.parametros = parametros;
    }

    public Map<String, Object> getParams2() {
        return params2;
    }

    public void setParams2(Map<String, Object> params2) {
        this.params2 = params2;
    }

}

Сообщение об ошибке:

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/test] threw exception [viewId:/main.jsf - No se pudo restablecer la vista /main.jsf.] with root cause
javax.faces.application.ViewExpiredException: viewId:/main.jsf - No se pudo restablecer la vista /main.jsf.
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)

Мне нужно знать, почему это происходит, а не как обрабатывать исключение. Я не могу вызвать какое-либо действие из commandButton, потому что ничего не происходит.


person user2846482    schedule 15.10.2013    source источник
comment
ваш первый commandButton не имеет атрибута action, поэтому этот наверняка не вызовет ваш вспомогательный компонент. Хотя другой должен. На самом деле это произошло на моем локальном рабочем примере ... У вас есть какое-либо сообщение об ошибке (либо в браузере, либо в консоли Java)?   -  person Valentin Jacquemin    schedule 15.10.2013
comment
я знаю, что мой первый commandButton не имеет действия ... просто есть, лол ... и я сейчас опубликую свое полное сообщение об ошибке.   -  person user2846482    schedule 15.10.2013


Ответы (1)


Я решил это с помощью этого:

 <context-param>
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
     <param-value>client</param-value>
 </context-param>

В некоторых местах видел вот так javax.faces.PARTIAL_STATE_SAVING но не получилось.

person user2846482    schedule 28.10.2013
comment
Есть ли какие-либо последствия для безопасности при сохранении состояния на клиенте? - person jrobertsz66; 28.08.2014
comment
@jrobertsz66 jrobertsz66, если вы можете понять очень длинные хешированные и закодированные (и, возможно, зашифрованные) строки в вашем html, содержащие состояние просмотра, которое в противном случае поддерживалось бы на сервере, теоретически вы могли бы изменить их и отправить другие данные на сервер. Удачи :) - person jwenting; 08.06.2015