SEAM - Filtro utilizando combo

81 views
Skip to first unread message

Lelo

unread,
Oct 4, 2010, 1:25:15 PM10/4/10
to javasf: JavaServer Faces Group
Caros,

Estou utilizando o Seam e neste momento estou precisando melhorar os
filtros de algumas de minhas listas.

O que estou precisando é colocar em uma tela de listagem um filtro
utilizando uma combo.
Por exemplo, tenho uma listagem de cidades e quero filtrar por estado,
para tal eu colocaria uma combo com os estados.
Para campos texto isso é extremamente simples, é inclusive o que o
Jboss Tools faz na geração automática de código quando utilizamos
engenharia reversa pegando as tabelas já existentes no BD.
Agora para entidades associadas isso parece não funcionar.

Alguém já fez isso?

Grato

Abraço!

Assis Júnior

unread,
Oct 4, 2010, 6:09:20 PM10/4/10
to jav...@googlegroups.com
Kra, tenta colocar o teu entity-query/list como Conversation.

No caso dos filtros do tipo estado/cidade você pode criar um componente que somente faça isso e poderá reusar em vários pontos do teu sistema.


--
Você recebeu esta mensagem por que é membro do  Javasf
http://groups.google.com/group/javasf

Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Atenciosamente,
Assis júnior
SCJP 5.0 Certified

Lelo

unread,
Oct 5, 2010, 7:44:35 AM10/5/10
to jav...@googlegroups.com
Caro Assis,

Primeiramente obrigado por sua disposição.

Citei o caso de Cidades/Estados para exemplificar mas o filtro que quero fazer não é exatamente este.

Tenho algo semelhante a um cadastro, mas que na verdade é uma lista de arquivos enviados para o sistema, e quero poder filtrar pelas empresas dos usuários. Há usuários de várias empresas e o administrador do sistema tem que poder filtrar por empresa. Ou seja a empresa do usuário que enviou o arquivo.

Para isso quero colocar uma combo que liste as empresas para o Admin. Utilizar primitivos do objeto em questão é bem simples, mas ainda não entendi como filtrar associações.

Desde já agradeço sua ajuda.

Abraço!

2010/10/4 Assis Júnior <assi...@gmail.com>



--
Rogério De Pieri  (Lelo)
Buscando melhorar a cada dia
Áudio, Hardware & Software

Samer

unread,
Oct 5, 2010, 10:28:01 AM10/5/10
to javasf: JavaServer Faces Group
Eu faço da seguinte maneira:

*** Filtro ***
<s:decorate id="estadoDecoration">
<ui:define name="label">Estado</ui:define>
<h:selectOneMenu value="#{cidadeAction.filtroEstado}">
<f:selectItems value="#{listaTodosEstados}" />
<a:support event="onchange"
reRender="estadoDecoration, listaCidadesDataTable"
ajaxSingle="true"
action="#{cidadeAction.buscaCidadesPorEstado}" />
</h:selectOneMenu>
</s:decorate>

*** Data Table ***
<rich:dataTable id="listaCidadesDataTable" var="list"
value="#{listaCidadesPorEstado}"
rendered="#{listaCidadesPorEstado.size > 0}">

*** MB ***
@Out(required=false)
private Estado filtroEstado; (utilizado no filtro)

@Factory("listaCidadesPorEstado")
public void buscaCidadesPorEstado() {
listaCidadesPorEstado = em.createQuery("select c from Cidade c where
c.estado = :estado").setParameter("estado",
filtroEstado).getResultList();
}

Espero ter ajudado!
Abraços!

On 5 out, 08:44, Lelo <lelo.pi...@gmail.com> wrote:
> Caro Assis,
>
> Primeiramente obrigado por sua disposição.
>
> Citei o caso de Cidades/Estados para exemplificar mas o filtro que quero
> fazer não é exatamente este.
>
> Tenho algo semelhante a um cadastro, mas que na verdade é uma lista de
> arquivos enviados para o sistema, e quero poder filtrar pelas empresas dos
> usuários. Há usuários de várias empresas e o administrador do sistema tem
> que poder filtrar por empresa. Ou seja a empresa do usuário que enviou o
> arquivo.
>
> Para isso quero colocar uma combo que liste as empresas para o Admin.
> Utilizar primitivos do objeto em questão é bem simples, mas ainda não
> entendi como filtrar associações.
>
> Desde já agradeço sua ajuda.
>
> Abraço!
>
> 2010/10/4 Assis Júnior <assisp...@gmail.com>
>
>
>
> > Kra, tenta colocar o teu entity-query/list como Conversation.
>
> > No caso dos filtros do tipo estado/cidade você pode criar um componente que
> > somente faça isso e poderá reusar em vários pontos do teu sistema.
>

Lelo

unread,
Oct 5, 2010, 10:39:08 AM10/5/10
to jav...@googlegroups.com
Vou reproduzir com mais detalhe a minha situação para ver se vocês podem me ajudar...

A entidade que estou listando e quero filtrar é:

public class UploadedFile implements java.io.Serializable {
...
    private int id;
    private Company producer;
...
}

Quem lista:

public class UploadedFileList extends EntityQuery<UploadedFile> {

    private static final String[] RESTRICTIONS = {
    "lower(uploadedFile.path) like lower(concat('%',concat(#{uploadedFileList.uploadedFile.path},'%')))" ,

    "uploadedFile.producer.id = #{uploadedFileList.uploadedFile.id}"};
   
    private static final String EJBQL = "SELECT uploadedFile FROM UploadedFile uploadedFile WHERE uploadedFile.parent IS NULL";

    private UploadedFile uploadedFile = new UploadedFile();

    public UploadedFileList() {
        setEjbql(EJBQL);
        setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS));
        setRestrictionLogicOperator("and");
        setOrderColumn("uploadedFile.uploadedDate");
        setOrderDirection("desc");
        setMaxResults(25);
    }
}

O filtro na interface onde é listado:
<h:form id="uploadedFileSearch" styleClass="edit">
            <rich:simpleTogglePanel label="#{messages['search.filter']}" switchType="ajax">
                <s:decorate template="../../layout/display.xhtml">
                    <ui:define name="label">Arquivo</ui:define>
                    <h:inputText id="path" value="#{uploadedFileList.uploadedFile.path}"/>
                </s:decorate>
                <s:decorate template="../../layout/display.xhtml">
                    <ui:define name="label">Produtor</ui:define>
                    <h:selectOneMenu id="producer"
                                    value="#{uploadedFileList.uploadedFile.producer}"
                                    required="true">
                        <s:selectItems value="#{pointUploadServiceHome.getProducers()}"
                                        var="_producer"
                                        label="#{_producer.name}"
                                        noSelectionLabel="Selecione um produtor..."/>
                        <s:convertEntity />
                    </h:selectOneMenu>
                </s:decorate>
                <s:decorate template="../../layout/display.xhtml">
                    <div class="actionButtons">
                        <h:commandButton id="search" value="#{messages['search']}" action="/pages/upload/point/UploadedFileList.xhtml"/>
                        <s:button id="reset" value="#{messages['reset']}" includePageParams="false"/>
                    </div>
                </s:decorate>
            </rich:simpleTogglePanel>
        </h:form>

O que acontece:

Ao entrar na página de listagem já não vem nenhum valor, pois já tenta filtrar pelo provider. No caso de eu selecionar uma opção na combo e filtrar ocorre o seguinte erro:

javax.el.ELException: Can't set property 'producer' of type 'br.com.mycompany.myproject.entity.Company' on class 'br.com.
mycompany.myproject.entity.UploadedFile' to value 'br.com.mycompany.myproject.entity.Company@6a5afc'.
    at javax.el.BeanELResolver.setValue(BeanELResolver.java:330)
    at javax.el.CompositeELResolver.setValue(CompositeELResolver.java:275)
    at com.sun.faces.el.FacesCompositeELResolver.setValue(FacesCompositeELResolver.java:100)
    at org.jboss.el.parser.AstPropertySuffix.setValue(AstPropertySuffix.java:73)
    at org.jboss.el.parser.AstValue.setValue(AstValue.java:84)
    at org.jboss.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:249)
    at org.jboss.seam.core.Expressions$1.setValue(Expressions.java:117)
    at org.jboss.seam.navigation.Pages.applyConvertedValidatedValuesToModel(Pages.java:846)
    at org.jboss.seam.navigation.Pages.postRestore(Pages.java:443)
    at org.jboss.seam.jsf.SeamPhaseListener.postRestorePage(SeamPhaseListener.java:545)
    at org.jboss.seam.jsf.SeamPhaseListener.afterRestoreView(SeamPhaseListener.java:394)
    at org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:230)
    at org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:196)
    at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
    at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.el.BeanELResolver.setValue(BeanELResolver.java:313)


Desde já agradeço o apoio de quem puder me ajudar.

Abraço!

2010/10/5 Lelo <lelo....@gmail.com>

Lelo

unread,
Oct 8, 2010, 10:05:13 AM10/8/10
to jav...@googlegroups.com
Ressuscitando o tópico...

Consegui dar fim nos erros mas ainda não está funcionando.

Para dar uma relembrada, eu tenho uma listagem de arquivos que os usuários enviam para o sistema. Cada arquivo enviado está sempre associado a uma entidade chamada produtor. O que eu desejo é colocar, para o usuário admin, um filtro nesta listagem para que o mesmo possa filtrar pela entidade produtor.

Segue o formulário de busca:

<h:form id="uploadedFileSearch" styleClass="edit">
            <rich:simpleTogglePanel label="#{messages['search.filter']}" switchType="ajax">
                <s:decorate template="../../layout/display.xhtml">
                    <ui:define name="label">Arquivo</ui:define>
                    <h:inputText id="path" value="#{uploadedFileList.uploadedFile.path}"/>
                </s:decorate>
                <s:decorate template="../../layout/display.xhtml" rendered="#{s:hasRole(accountHome.roleNameAdmin)}">

                    <ui:define name="label">Produtor</ui:define>
                    <h:selectOneMenu value="#{uploadedFileList.uploadedFile.producer}" id="producer" name="producer">

                        <s:selectItems value="#{pointUploadServiceHome.getProducers()}"
                                        var="_producer"
                                        label="#{_producer.name}"
                                        noSelectionLabel="Selecione um produtor..."/>
                        <s:convertEntity />
                    </h:selectOneMenu>
                </s:decorate>
               
                <s:decorate template="../../layout/display.xhtml">
                    <ui:define name="label">#{messages['match']}</ui:define>
                    <h:selectOneRadio id="logic" value="#{uploadedFileList.restrictionLogicOperator}" styleClass="radio">
                        <f:selectItem itemLabel="#{messages['match.all']}" itemValue="and"/>
                        <f:selectItem itemLabel="#{messages['match.any']}" itemValue="or"/>
                    </h:selectOneRadio>

                </s:decorate>
               
                <s:decorate template="../../layout/display.xhtml">
                    <div class="actionButtons">
                        <h:commandButton id="search" value="#{messages['search']}" action="/pages/upload/point/UploadedFileList.xhtml"/>
                        <s:button id="reset" value="#{messages['reset']}" includePageParams="false"/>
                    </div>
                </s:decorate>
            </rich:simpleTogglePanel>
        </h:form>


O que pude observar no firebug:
Quando o botão de buscar é clicado, é feito um post com as informações corretas.

javax.faces.ViewStatej_id3
uploadedFileSearch uploadedFileSearch
uploadedFileSearch:j_id36...
uploadedFileSearch:j_id41... 1
uploadedFileSearch:j_id47... and
uploadedFileSearch:j_id54... Buscar

O ítem em vermelho acima é o meu producer sendo enviado.

No entanto quando na sequência o borwser faz um get, o mesmo não envia o producer. Pelo que entedi este producer não está sendo setado no objeto que é usado para manter os parâmetros dos filtros no list.

Alguém tem uma ideia do que esteja acontecendo?

Grato

Lelo De Pieri

2010/10/5 Lelo <lelo....@gmail.com>

Lelo

unread,
Oct 21, 2010, 2:26:16 PM10/21/10
to javasf: JavaServer Faces Group
Olá...

Alguém tem alguma ideia de oque pode estar acontecendo?

Alguém utiliza combos para fazer filtros sobre listas como eu utilizo?

Se o faz poderia dar um exemplo para eu comparar?

Grato!

Abraço!
> javax.faces.ViewStatej_id3uploadedFileSearch uploadedFileSearch
> uploadedFileSearch:j_id36...
> uploadedFileSearch:j_id41... 1uploadedFileSearch:j_id47... and
> uploadedFileSearch:j_id54... Buscar
> O ítem em vermelho acima é o meu producer sendo enviado.
>
> No entanto quando na sequência o borwser faz um get, o mesmo não envia o
> producer. Pelo que entedi este producer não está sendo setado no objeto que
> é usado para manter os parâmetros dos filtros no list.
>
> Alguém tem uma ideia do que esteja acontecendo?
>
> Grato
>
> Lelo De Pieri
>
> 2010/10/5 Lelo <lelo.pi...@gmail.com>
> ...
>
> mais »

Lelo

unread,
Oct 21, 2010, 3:50:27 PM10/21/10
to javasf: JavaServer Faces Group
Problema resolvido

Eu tenho o UploadedFileList, que retorna uma lista de uploadedFiles.
O uploadedFiles tem um atributo path (String) e um fornecedor
(empresa).
Para filtrar pelo caminho o parâmetro de filtro foi armazenado em
uploadedFileList.uploadedFile.path mas aparentemente não funciona para
valores não primitivos como o fornecedor (do tipo Empresa).
Para resolver eu declarei um novo atributo fornecedor no
uploadedFileList e utilizei para o filtro. Tudo 10!

Será que pode ser um bug?

Obrigado pela ajuda.

Abraço!

@lelopieri
> ...
>
> mais »
Reply all
Reply to author
Forward
0 new messages