[Resolvido] JSF - Montagem de <h:selectOneMenu/>

6 respostas
cris2

Preciso montar um <h:selectOneMenu/> na tela de Pessoa com os dados da tabela de DominioValor, que por sua vez está associada a tabela Domínio. Estou com dificuldades em fazer a montagem do mesmo…
Segue as classes:

Pessoa:

@Entity
@Table(name="pessoa")
@Inheritance(strategy=InheritanceType.JOINED)
@SequenceGenerator(name="seq_pessoa", sequenceName="sq_pessoa")
public abstract class Pessoa implements GenericEntity {

	private Long id;
	private String 	nome;

       [b] @Type(type="domain", parameters={@Parameter(name="domainName", value="dm_tipo_pessoa")})
	@NotNull
	@Column(name="tp_pessoa")
	private DominioValor tpPessoa;[/b]

	//Gets & Sets	
}

DominioValor:

@Entity
@Table(name="dominio_valor")
@SequenceGenerator(name="seq_dominio_valor", sequenceName="sq_dominio_valor")
public class DominioValor implements GenericEntity {
	private static final long serialVersionUID = 1L;

	private Long id;
	private String valor;
	private String descricao;
	private Boolean ativo;
	private Integer ordem;

@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
	@JoinColumn(name="id_dominio", insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	@NotNull
	private Dominio dominio;

	//Gets & Sets
}

Dominio

@Entity
@Table(name="dominio")
@SequenceGenerator(name="seq_dominio", sequenceName="sq_dominio")
public class Dominio implements GenericEntity {
	private static final long serialVersionUID = 1L;

	private Long id;
	private String nome;
	private String descricao;

	@OneToMany(mappedBy="dominio", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
	@JoinColumn(name="id_dominio")
	private List&lt;DominioValor&gt; valores;
	
	//Gets & Sets
}

Alguém teria alguma idéia de como montar isso no Cadastro de Pessoa? :roll:
Obrigada!

6 Respostas

Leozin

oi cris =) tudo bem contigo?

deixa eu ver se eu entendi… tu quer popular um h:selectOneMenu com uma lista de valores que vem de um OneToMany com o objeto principal, no caso Pessoa?

bjo =*

R

é so colocar o componente na tela e acessar uma coleção que contenha os dados da consulta

cris2

Oi Leozin! Tudo bem sim, e ctg?

É assim, eu tenho um cadastro de Pessoa, nele tenho um campo para preenchimento chamado “Tipo” que é o tpPessoa do tipo DominioValor.
Tenho uma tabela que está associada a classe Dominio com o registro “Tipo de Pessoa” que por sua vez está associado a DominioValor que tem lá os valores “Funcionário”, “Estagiário”, “Conveniado”…

Então o meu <h:selectOneMenu/> teria que ser populado com os dados de DominioValor, mais eu teria que saber que os dados tem que ser os que estão associados ao Dominio “Tipo de Pessoa”.

Tipo uma montagem de <h:selectOneMenu/> com dados do banco. Pois cada vez que eu for carregar um <h:selectOneMenu/> que tenha dados do tipo DominioValor, eu vou ter que checar de que Dominio eu quero carregar (Exemplo: Tipo de Pessoa, Tipo Empresa, Tipo de Endereco…)

Mas eu não estou conseguindo fazer isso. Não sei como pegar os valores com essa associação. :frowning:

Me fiz entender? :slight_smile:

Obrigada! Abraço!

Leozin

to quase entendendo

vou chutar

por que tu não popula os dados assim?

#{meuBean.pessoa.tpPessoa.dominio.valores}

é por ae?

cris2

Oi Leozin!

Criei um método DomainValueMBean que extends a DomainValueUtil e me retorna uma List dos dados que preciso para preencher meu <selectOneMenu/>. A query está correta, com os dados ok.
Segue abaixo:

DomainValueMBean:

public class DomainValueMBean extends DomainValueUtil {

	@PersistenceContext
	protected EntityManager entityManager;
	
	private List&lt;DominioValor&gt; tpPessoas;
	private List&lt;DominioValor&gt; tpVinculoPessoas;
	
	public List&lt;DominioValor&gt; getTpPessoas() {
		if(tpPessoas == null){
			tpPessoas = new ArrayList&lt;DominioValor&gt;();
		}
		
		Session session = (Session) entityManager.getDelegate();
				
		SessionImplementor sessionImplementor = (SessionImplementor)session;
		String domainName = "dm_tipo_pessoa";
		Boolean onlyActive = true;
		boolean sortValues = true;
		
		tpPessoas = findDomainValuesByDomainName(sessionImplementor, domainName, onlyActive, sortValues);
		
		return tpPessoas;
	}
}

DomainValueUtil:

public class DomainValueUtil {
	public static final String CACHE_DOMAIN_VALUES_REGION_NAME = "core.cache.domainValues";
	private static final String defaultHQL = "select dv from "+ DominioValor.class.getName() + " dv inner join fetch dv.dominio d where d.nome = :domainName";

    /**
     * Consulta a lista de valores dominio de acordo com o nome do domino informado.
     * 
     * @param session Sessão do Hibernate.
     * @param domainName Nome do dominio.
     * @param onlyActive Indica que devem ser retornados apenas os valores ativos.
     * @param sortValues Indica se devem ser ordenados os valores dominios de acordo com o campo de 'ordem'.
     * @return
     */
    @SuppressWarnings("unchecked")
	public static List&lt;DominioValor&gt; findDomainValuesByDomainName(SessionImplementor session, String domainName, Boolean onlyActive, boolean sortValues) {
    	Validate.notNull(session, "session não pode ser null");

    	StringBuffer hql = new StringBuffer(defaultHQL);

        if (onlyActive != null) {
        	hql.append(" and dv.ativo= :onlyActive");
        }

        if (sortValues) {
        	hql.append(" order by dv.ordem");
        }

        Query query = ((AbstractSessionImpl)session).createQuery(hql.toString());
        query.setCacheable(true);
        query.setCacheRegion(CACHE_DOMAIN_VALUES_REGION_NAME);
        query.setParameter("domainName", domainName);

        if (onlyActive != null) {
            query.setParameter("onlyActive", onlyActive);
        }
    	
        return query.list();
    }

E fica assim o JSF:

&lt;h:selectOneMenu id="tpPessoa" 
			    value="#{pessoaMBean.pessoa.tpPessoa.id}"
 			    required="true" 																		 
                            styleClass="selectComum"&gt;
        &lt;s:selectItems value="#{domainValueMBean.tpPessoas}"/&gt;   
&lt;/h:selectOneMenu&gt;

Problema:

2008-04-29 11:31:22,046 ERROR acesso.security.SecurityExceptionFilter  -&gt; ERROR: SecurityExceptionFilter: 
javax.servlet.ServletException
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:277)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
	at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:276)
	at org.ajax4jsf.Filter.doFilter(Filter.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119)
	at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:112)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.conectait.acesso.security.SecurityExceptionFilter.doFilter(SecurityExceptionFilter.java:36)
	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:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	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:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
	at com.sun.faces.context.RequestMap.put(ExternalContextImpl.java:1096)
	at net.sf.jsfcomp.easysi.UISelectItems.putIteratorToRequestParam(Unknown Source)
	at net.sf.jsfcomp.easysi.UISelectItems.createSelectItems(Unknown Source)
	at net.sf.jsfcomp.easysi.UISelectItems.getValue(Unknown Source)
	at com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:295)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:801)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:280)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:856)
	at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:286)
	at org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
	at org.richfaces.renderkit.TabRendererBase.encodeChildren(TabRendererBase.java:113)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:832)
	at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:282)
	at org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
	at org.richfaces.renderkit.html.TabPanelRenderer.doEncodeChildren(TabPanelRenderer.java:286)
	at org.richfaces.renderkit.html.TabPanelRenderer.doEncodeChildren(TabPanelRenderer.java:281)
	at org.ajax4jsf.renderkit.RendererBase.encodeChildren(RendererBase.java:121)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:832)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:148)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:832)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:942)
	at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:271)
	at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:202)
	at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
	at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
	... 44 more

:cry:

Valew pela dica! E pela disposição em ler isso tudo! :slight_smile:
Até mais!

cris2

Resolvido o problema! Para carregar o <selectOneMenu/> é o seguinte:

JSF:

&lt;h:selectOneMenu id="tpPessoa" value="#{pessoaMBean.pessoa.tpPessoa.id}"&gt;										
        &lt;s:selectItems value="#{dominioValorMBean.tpPessoas}" 
                        var="tpPessoa" 
                        itemLabel="#{tpPessoa.descricao}" 
                        itemValue="#{tpPessoa.id}"/&gt;
&lt;/h:selectOneMenu&gt;

Além do DomainValueMBean já postado, foram criados um DomainValueService e um DomainValueDAO, para não pegar a session do Hibernate direto pelo MBean… Algumas pequenas alterações foram feitas para atender isso, mas nada de mais! :slight_smile:

É isso ai! Valew! :wink:

Criado 28 de abril de 2008
Ultima resposta 29 de abr. de 2008
Respostas 6
Participantes 3