ViewScope Spring 3 + JSF 2

12 respostas
F

Estou tentando implementar o ViewScoped na minha aplicação, adicionando o @ViewScoped do JSF 2 nos meus MB, mas quando faço o deploy, dispara varias excecoes do tipo

08/11/2011 14:56:18 org.apache.catalina.session.StandardSession writeObject WARNING: Cannot serialize session attribute com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap for session 7296B5F8D2AE71D1FE6849645E8518BF java.io.NotSerializableException: org.springframework.security.authentication.ProviderManager

assim tenho que implementar Serializable em todas as minhas classes, desde o DAO Service ate o meu MB, o que devo fazer para resolver esse problema, se eu nao implemento nao funciona o scope de view

12 Respostas

M

Vê aí se te ajuda

http://www.harezmi.com.tr/spring-view-scope-for-jsf-2-users/

F

Vc deve criar a classe ViewScope e declará-la no applicationContext.
Aqui tem um exemplo

F

Não estou conseguindo encontrar nada nesse blog, nem traduzindo a pagina de turco para portugues…

X

Off-topic
Desculpa mais alguem poderia ver meu topico :


Preciso resolver esse problema urgente para poder continuar meu estudo.

F

Entao ja tentei implementar essa view do spring mas continuou a mesma coisa, acabei optando por deixar o JSF2 responsavel pelos MB atraves do @ManagedBean e o @ManagedProperty que faz a injecao dos services do Spring no meu MB, quando tentei utilizar o view ocorreu o mesmo problema de Serialize

F

Nesse exemplo que passei o spring é “responsável” pelos managed beans. Talvez vc tenha que usar dessa forma pra funcionar junto com o Spring Security

F

Entao eu implementei dessa forma mas tb nao funcionou, segue o meu template...

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">

    <h:head>
        <ui:insert name="titulo">
            <title>#{msg['aplicacao.titulo']}</title>
        </ui:insert>

        <ui:insert name="cabecalho">
            <link href="${facesContext.externalContext.requestContextPath}/style/jquery-ui-1.8.16.custom.css" type="text/css" rel="stylesheet"  />
            <link href="${facesContext.externalContext.requestContextPath}/style/listaNFe.css" type="text/css" rel="stylesheet" />
            <link href="${facesContext.externalContext.requestContextPath}/style/listaEmpresa.css" type="text/css" rel="stylesheet" />
            <link href="${facesContext.externalContext.requestContextPath}/style/default.css" type="text/css" rel="stylesheet" />
            <ui:insert name="javascript" />
            <ui:insert name="css" />
        </ui:insert>
    </h:head>

    <h:body>
        <p:growl id="growlMessage" showDetail="true" />

        <ui:insert name="body">

            <h:form prependId="false">
                <p:layout fullPage="true">

                    <p:layoutUnit position="top" height="52">
                        <p:panel id="pnlTopo" styleClass="topo">
                            <ui:insert name="login">
                                <ui:include src="usuarioLogado.xhtml"/>
                            </ui:insert>
                        </p:panel>
                    </p:layoutUnit>

                    <p:layoutUnit position="center" closable="false">

                        <ui:insert name="menu"/>
                        <br/>

                        &lt;p:outputPanel id="pnlCorpo"&gt;
                            &lt;ui:insert name="corpo"&gt;
                                &lt;ui:include src="#{menuController.menuSelected}"/&gt;
                            &lt;/ui:insert&gt;
                        &lt;/p:outputPanel&gt;

                    &lt;/p:layoutUnit&gt;

                    &lt;p:layoutUnit position="bottom" height="75"&gt;  
                        &lt;ui:include src="rodape.xhtml"/&gt;
                    &lt;/p:layoutUnit&gt;

                &lt;/p:layout&gt;

            &lt;/h:form&gt;

            &lt;ui:include src="dialogAlterarSenha.xhtml" /&gt;

            &lt;p:outputPanel id="pnlDialog" rendered="#{menuController.hasDialog}"&gt;
                &lt;ui:insert name="dialog"&gt;
                    &lt;ui:include src="#{menuController.dialogSelected}"/&gt;
                &lt;/ui:insert&gt;
            &lt;/p:outputPanel&gt;

        &lt;/ui:insert&gt;
    &lt;/h:body&gt;
&lt;/html&gt;
MenuController
@ManagedBean(name=&quot;menuController&quot;)
@SessionScoped
//@Component(&quot;menuController&quot;)
//@Scope(&quot;session&quot;)
public class MenuController implements Serializable {

    private String menuSelected;
    private String dialogSelected;
    private boolean hasDialog;
    

    @PostConstruct
    public void init() {
        menuSelected = &quot;../pages/nfe/listaNFe.xhtml&quot;;
        dialogSelected = &quot;../pages/nfe/dialogNFe.xhtml&quot;;
        hasDialog = true;
    }
    
    @PreDestroy
    public void destroy() {
        
    }

    public void menuNFe(ActionEvent event) {
        menuSelected = &quot;../pages/nfe/listaNFe.xhtml&quot;;
        hasDialog = true;
        dialogSelected = &quot;../pages/nfe/dialogNFe.xhtml&quot;;
    }

    public void menuEmpresa(ActionEvent event) {
        menuSelected = &quot;../pages/empresa/listaEmpresa.xhtml&quot;;
        hasDialog = true;
        dialogSelected = &quot;../pages/empresa/dialogEmpresa.xhtml&quot;;
    }

    public void menuUsuario(ActionEvent event) {
        menuSelected = &quot;../pages/usuario/listaUsuario.xhtml&quot;;
        hasDialog = true;
        dialogSelected = &quot;../pages/usuario/dlgUsuario.xhtml&quot;;
    }

    public boolean getHasDialog() {
        return hasDialog;
    }

    public void setHasDialog(boolean hasDialog) {
        this.hasDialog = hasDialog;
    }

    public String getMenuSelected() {
        return menuSelected;
    }

    public String getDialogSelected() {
        return dialogSelected;
    }
}
menu.xhtml
&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;!DOCTYPE html&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:sec="http://www.springframework.org/security/facelets/tags" 
      xmlns:h="http://java.sun.com/jsf/html"&gt;

    &lt;p:menubar autoSubmenuDisplay="true"&gt;  
        &lt;p:submenu label="Cadastro" icon="ui-icon ui-icon-pencil"&gt;  
            &lt;p:menuitem value="Empresa" actionListener="#{menuController.menuEmpresa}" 
                        update="pnlCorpo pnlDialog" icon="ui-icon ui-icon-triangle-1-e"/&gt;  
            &lt;!--&lt;p:menuitem value="Usuário" action="/pages/usuario/corpoUsuario?faces-redirect=true"
                        ajax="single" icon="ui-icon ui-icon-triangle-1-e"/&gt; --&gt;
            &lt;p:menuitem value="Usuário" actionListener="#{menuController.menuUsuario}"
                        update="pnlCorpo pnlDialog" icon="ui-icon ui-icon-triangle-1-e"/&gt;
        &lt;/p:submenu&gt; 

        &lt;p:menuitem value="NFe" actionListener="#{menuController.menuNFe}" 
                    update="pnlCorpo pnlDialog" icon="ui-icon ui-icon-document"/&gt;

        &lt;p:submenu label="Configurações" icon="ui-icon ui-icon-gear"&gt;  

        &lt;/p:submenu&gt; 

        &lt;p:submenu label="Ajuda" icon="ui-icon ui-icon-help"&gt;  

        &lt;/p:submenu&gt;  

        &lt;p:menuitem value="Sair" action="#{loginController.logout}" icon="ui-icon ui-icon-close" /&gt;  
    &lt;/p:menubar&gt;

&lt;/html&gt;
UsuarioController
@ManagedBean(name="usuarioController")
@ViewScoped
//@Component("usuarioController")
//@Scope("session")
public class UsuarioController implements Serializable {

    // &lt;editor-fold defaultstate="collapsed" desc="Atributos"&gt; 
    @ManagedProperty(name="usuarioService", value="#{usuarioService}")
    private UsuarioService usuarioService;
    private List&lt;Usuario&gt; usuarioList;
    private List&lt;Role&gt; roleList;
    private Usuario selectedUsuario;
    //&lt;/editor-fold&gt;

//    @Autowired
//    public UsuarioController(UsuarioService usuarioService) {
//        this.usuarioService = usuarioService;
//    }

    @PostConstruct
    public void init() {
        setUsuarioList(usuarioService.getByAtivo(true));
    }

    @PreDestroy
    public void destroy() {
    }

    // &lt;editor-fold defaultstate="collapsed" desc="GET / SET"&gt; 
    public List&lt;Role&gt; getRoleList() {
        return roleList;
    }

    public void setRoleList(List&lt;Role&gt; roleList) {
        this.roleList = roleList;
    }

    public Usuario getSelectedUsuario() {
        return selectedUsuario;
    }

    public void setSelectedUsuario(Usuario selectedUsuario) {
        this.selectedUsuario = selectedUsuario;
    }

    public List&lt;Usuario&gt; getUsuarioList() {
        return usuarioList;
    }

    public void setUsuarioList(List&lt;Usuario&gt; usuarioList) {
        this.usuarioList = usuarioList;
    }
    
    public void setUsuarioService(UsuarioService usuarioService) {
        this.usuarioService = usuarioService;
    }
    //&lt;/editor-fold&gt;
    
}

Acontece o seguinte quando inicio a aplicação carrega uma tabela, clico para visualizar um item da tabela e me mostra um dialog com os dados tudo ok, mas depois que faço isso navego no menu para o usuario por exxemplo, ele popula a tabela tudo certo mas quando clico em editar um registro da tabela me abre o dialog sem nenhum dado como se nao disparace o metodo setSelectedUsuario

F

Ja estou chegando a conclusao que o problema nao esta no scope e sim como estou manipulando os componentes do primefaces os updates no pnlCorpo e dialog, mas oq ue estou fazendo errado?

T

Olá furacao123,
não tenho certeza da solução e também talvez seja tarde demais para você, mas aqui vai uma possível solução que vi em um comentário feito pelo Rafael Pontes em um site americano dizendo o seguinte:

Site: http://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/

Site2: http://blog.primefaces.org/?p=702

Site3: https://jira.spring.io/browse/SPR-6543

A
Vamos lá senhores contrua a seguinte classe
public class ViewScope implements Scope {
 
    @SuppressWarnings("unchecked")
    public Object get(String name, ObjectFactory objectFactory) {
        Map<String,Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
 
        if(viewMap.containsKey(name)) {
            return viewMap.get(name);
        } else {
            Object object = objectFactory.getObject();
            viewMap.put(name, object);
 
            return object;
        }
    }
 
    public Object remove(String name) {
        return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name);
    }
 
    public String getConversationId() {
        return null;
    }
 
    public void registerDestructionCallback(String name, Runnable callback) {
        //Not supported
    }
 
    public Object resolveContextualObject(String key) {
        return null;
    }
}
Declare no spring
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="view">
                    <bean class="br.com.exemplojsf2.web.util.ViewScope"/>
                </entry>
            </map>
        </property>
    </bean>

Aqui está o pulo do gato vc tem que apontar o managed para o scopo de view controlado pelo spring ok.

@ManagedBean(name="menuController")  
@Scope("view")
public class MenuController implements Serializable {  *** }
E quando a serialização SIM por favor serialize tudo sempre.
R

Aqui vai a fonte de onde nosso amigo alexafe acima tirou a informação:

Esse cara é fera demais, e só poderia ser, neh, afinal é o criador do PrimeFaces.

Vale a pena investir tempo lendo seus posts.

A

:slight_smile:

Criado 8 de novembro de 2011
Ultima resposta 9 de jun. de 2015
Respostas 12
Participantes 7