Passar parametros para construtor do ManagedBean

Boa tarde, estou iniciando o desenvolvimento de um template de CRUD em JSF.
Nessa aplicação vai existir várias telas de crud, minha idéia é fazer com que todas essas páginas usem o mesmo managed bean, pra isso o managedBean deve receber alguns parametros, como o tipo da classe que a tela trabalha, as colunas da tabela de pesquisa, etc…
A idéia é usar esses parametros pra inicializar os componentes do crud.
Porém como todos sabem, o managedbean é construído automaticamente pelos frameworks que itilizamos pra programar em java web.

Tem como fazer isso que eu quero?

Até hoje não ouvi falar de algo tão genérico assim como você quer.

Já teve essa discussão aqui mas não se chegou a nenhuma resposta ou solução concreta.

Você pode trabalhar com um bean genérico onde todos os outros bean irão implementar ele.

Acho que não seria uma boa trabalhar somente com 1 único bean.

É possível fazer herança de managedBean?

[quote=mateusviccari]É possível fazer herança de managedBean?[/quote]Sim. Mas não o tipo de herança que pessoas que querem um CRUD genérico funcione.
Não adianta na super classe colocar List<?> valores ou List. Não vai funcionar.

Alguma outra idéia pra mim fazer isso ? Lá no swing era fácil de fazer, mas swing ta morrendo…

[quote=mateusviccari]Alguma outra idéia pra mim fazer isso ? Lá no swing era fácil de fazer, mas swing ta morrendo…[/quote]Novamente, até agora não.

Tive uma idéia aqui que parece que da certo.
Eu crio o managedBean principal, que seria o template, e nele eu tenho uma instancia de uma classe Configuracoes. Nessa classe é que eu defini o comportamento dos itens do template, por ex.: Gravar, consultar, excluir…
E possuo um outro managedBean, de requestScoped, pra cada tipo de classe que vai ser usada no template, esse managedBean tem a função getConfiguracoes, que retorna a configuração previamente definida, e seto ele na classe template através de um comando.
Aí a primeira coisa que faço quando tenho uma pagina que vai usar o template é transmitir essa configuração do managedBean requestScoped pra variavel configuracoes do template, e o resto faço a partir dessas configurações…

Não sei se expliquei direito mas se alguem quiser fazer algo parecido responde aqui e trocamos uma idéia.

[quote=mateusviccari]Tive uma idéia aqui que parece que da certo.
Eu crio o managedBean principal, que seria o template, e nele eu tenho uma instancia de uma classe Configuracoes. Nessa classe é que eu defini o comportamento dos itens do template, por ex.: Gravar, consultar, excluir…
E possuo um outro managedBean, de requestScoped, pra cada tipo de classe que vai ser usada no template, esse managedBean tem a função getConfiguracoes, que retorna a configuração previamente definida, e seto ele na classe template através de um comando.
Aí a primeira coisa que faço quando tenho uma pagina que vai usar o template é transmitir essa configuração do managedBean requestScoped pra variavel configuracoes do template, e o resto faço a partir dessas configurações…

Não sei se expliquei direito mas se alguem quiser fazer algo parecido responde aqui e trocamos uma idéia.[/quote]Beleza, o que você definiu é o mesmo que já foi dito acima. O “ideal” de um CRUD genérico é isso que você falou.

Agora faz um teste. Tente criar um MB genérico e tente fazer um datatable apontando para uma lista.

OBS.: é possível criar diversas funções em comum dentro os MBs, mas nunca vi alguém conseguir um CRUD completo. Se você conseguir, eu vou mostrar esse post para todos os outros posts criados sobre esse assunto. [=

O que eu fiz foi o seguinte:

<p:tab title="Consulta" titleStyle="font-size: small;"> <p:dataTable style="font-size: small" id="tabelaConsulta" var="obj" value="#{managedBeanTemplate.objetos()}" paginator="true" rows="10"> <ui:insert name="tabelaConsulta"/> </p:dataTable> </p:tab>
No meu managed bean o objetos esta assim

public ArrayList objetos(){ return configuracoes.objetos(); }
E a minha classe configurações é uma classe abstrata, aí eu implemento essa classe em varios managedBeans do tipo requestScoped, só pra carregar as configurações, como no exemplo:

[code]
@ManagedBean(name=“managedBeanUnidade”)
@RequestScoped
public class ManagedBeanUnidade extends Configuracoes implements Serializable {

@Override
public ArrayList objetos() {
    try {
        PreparedStatement pst = ConnectDb.getConnection().prepareStatement("select * from Unidade");
        ArrayList al = JdbcUtil.convertResultSetIntoList(Unidade.class, pst.executeQuery());
        return al;
    } catch (Exception e) {
        e.printStackTrace();
        return new ArrayList<Unidade>();
    } finally {
        ConnectDb.closeCurrentConnection();
    }
}

public Configuracoes getConfiguracoes(){
    return new ManagedBeanUnidade();
}

}[/code]
Aí depois disso, na tela de cada crud é so transferir a configuração desse managedBean request pro managedBean do template, dessa forma que eu fiz ja ta funcionando a DataTable:

[code]
<ui:composition template="/template/template.xhtml">

    <ui:define name="carregarConfiguracoes">
        #{managedBeanTemplate.setConfiguracoes(managedBeanUnidade.configuracoes)}
    </ui:define>
    
    <ui:define name="tabelaConsulta">
        <p:column>
            <f:facet name="header">
                <h:outputText value="Sigla" />
            </f:facet>
            <h:outputText value="#{obj.unida5descr}" />
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="Descrição" />
            </f:facet>
            <h:outputText value="#{obj.unida15descr}" />
        </p:column>
    </ui:define>
</ui:composition>[/code]

Por enquanto está sendo feita a inclusão manual das colunas, mas pretendo fazer algo pra ele fazer isso automaticamente, usando esse esquema da transferencia de configurações.