ViewScope Spring 3 + JSF 2

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

Vê aí se te ajuda

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

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

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

Off-topic
Desculpa mais alguem poderia ver meu topico :


Preciso resolver esse problema urgente para poder continuar meu estudo.

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

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

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

[code]<?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”>

&lt;h:head&gt;
    &lt;ui:insert name="titulo"&gt;
        &lt;title&gt;#{msg['aplicacao.titulo']}&lt;/title&gt;
    &lt;/ui:insert&gt;

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

&lt;h:body&gt;
    &lt;p:growl id="growlMessage" showDetail="true" /&gt;

    &lt;ui:insert name="body"&gt;

        &lt;h:form prependId="false"&gt;
            &lt;p:layout fullPage="true"&gt;

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

                &lt;p:layoutUnit position="center" closable="false"&gt;

                    &lt;ui:insert name="menu"/&gt;
                    <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;

</html>
[/code]

MenuController

[code]@ManagedBean(name="menuController")
@SessionScoped
//@Component("menuController")
//@Scope("session")
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;
}

}[/code]

menu.xhtml

[code]<?xml version=“1.0” encoding=“ISO-8859-1”?>
<!DOCTYPE html>
<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”>

&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;

</html>
[/code]

UsuarioController

[code]@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;

}[/code]

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

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?

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

Vamos lá senhores contrua a seguinte classe [code]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;
}

}[/code]

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.

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.

:slight_smile: