Duvida com herança e jsf

8 respostas
N
Bom dia a todos, Meu problema é o seguinte: tenho uma herança em que se divide em Pessoa, PessoaFisica, PessoaJuridica, Professor e ServidorPublico; Pessoa:
public class Pessoa {

	protected long id;

	protected String nome;

	protected String email;

	protected String senha;

	protected String login;

	protected long telefoneResidencial;
	
	protected long telefoneComercial;
	
	protected long telefoneCelular;

	protected Endereco endereco = new Endereco();

	protected String role;
}
PessoaFisica:
public class PessoaFisica extends Pessoa{

	protected int cpf;

	protected int matricula;

	protected int rg;
}
PessoaJuridica:
public class PessoaJuridica extends Pessoa{

	private long cnpj;

	private List<Pessoa> representantes;

	private String maskCnpj;

	public String getMaskCnpj(){
		String cnpj = String.valueOf(this.cnpj);
		return cnpj.substring(0, 3)+"."+cnpj.substring(3, 6)+"."+cnpj.substring(6, 9)+"/"+cnpj.substring(9,13)+"-"+cnpj.substring(13,15);
	}
}
Professor:
public class Professor extends PessoaFisica{

	private List<Disciplina> disciplinas = new ArrayList<Disciplina>();

	private Funcao funcao;
}
ServidorPublico:
public class ServidorPublico extends PessoaFisica{

	private Cargo cargo;
}
Então, no meu sistema eu preciso fazer o cadastro de Pessoa mas eu gostaria que no cadastro houvesse apenas uma página para eu não precisar repetir todo o código de pessoa nas filhas. Eu pensei em uma única página em que através de comboBox eu escolho qual filha eu devo cadastrar mas eu não sei como referenciar os dados de Pessoa para as minhas filhas, para ficar mais claro vou colocar um trecho do código:
<s:decorate template="/template/edit.xhtml">
					<ui:define name="label">Nome</ui:define>
					<h:inputHidden id="cod"
						value="#{pessoaMB.pessoa.id}" />
					<h:inputText id="nome"
						value="#{pessoaMB.pessoa.nome}" required="true"
						size="50" />
				</s:decorate>
Aqui eu mostro o campo nome de Pessoa, mas eu queria que este valor fosse para qualquer uma das filhas em tempo de execução, eu não posso colocar ali em value o valor #{pessoaJuridicaMB.pessoaJuridica.nome} porque no caso eu só estaria cadastrando pessoa jurídica. Desculpe se não fui muito claro, tentei exemplificar o máximo possível. Obrigado pela atenção.

8 Respostas

marcosharbs

você pode criar um bloco de código para pessoa física
e outro para pessoa jurídica
ai dependendo de uma flag do que o cara escolhe você renderiza um ou outro
usado o atributo rendered de um panelgrid por exemplo

N

Então marcosharbs, eu faço isso. O problema é que na hora de salvar eu preciso pegar todos os dados de pessoa (que são comum a todos) e colocar na filha que eu defino em tempo de execução, se eu fizer um bloco para cada filha repetindo os campos do pai irá ficar muito grande e eu não gostaria disso.
Será que não teria outra solução?
Grato.

marcosharbs

da pra fazer algo assim também:

<h:inputText id="txtNome" 
		    value="#{meuMBean.flag ? meuMBean.labelTeste1 : meuMBean.labelTeste2 }"/>

nesse exemplo se o atributo flag que é um boolean no meu mbean for true
o valor do input text vai ser o atributo labelTeste1 do meu mbean se flag for false
vai usar o atributo labelTeste2 do meu mbean, podes fazer algo parecido talvez

N

Acho que você matou a charada. Agora não tem como eu testar aqui, mas assim que eu chegar em casa eu testo. Será que tem como eu incrementar esse if?
Preciso verificar 2 flags a de professor servidorPublico, e a de pessoaFisica pessoaJuriica.
Brigadão mesmo marcosharbs, se der certo eu posto aqui.

marcosharbs

tem como incrementar o if sim
é um if ternário normal

ou chama um métodos tipo isXXXX
que valida as duas flgas nesse método

abraço

N

Bom marcosharbs, encontrei um problema aqui na implementação. Meu atributo que identifica de qual filha será o objeto é o atributo role de pessoa. Eu fiz o seguinte então:

<rich:comboBox value="#{pessoaMB.pessoa.role}" > <f:selectItem itemValue="pr" itemLabel="Professor"/> <f:selectItem itemValue="sp" itemLabel="Servidor Público"/> <f:selectItem itemValue="rp" itemLabel="Representante"/> <f:selectItem itemValue="pj" itemLabel="Fornecedor"/> </rich:comboBox>
Mas como eu havia dito anteriormente, eu não posso referenciar à pessoa, eu preciso que seja definido em tempo de execução para quem esse valor irá, mas para isso eu preciso dele antes.
Será que você tem alguma solução para este caso?

N

Bom, eu estava pensando em fazes o seguinte: Dividir o cadastro em etapas, e na primeira etapa apenas mostrar os campos referentes a pessoa (que são comuns a todos) e nos próximos passos apenas mostrar os atributos específicos. Pensei em utilizar o setPropertyActionListener, mas está ocorrendo o erro “java.lang.IllegalArgumentException: argument type mismatch”:

<a:commandButton value="Próxima etapa" action="#{pessoaMB.etapa2}" rendered="#{pessoaMB.isPessoaJuridica}">
       <f:setPropertyActionListener value="#{pessoaMB.pessoa}" target="#{pessoaJuridicaMB.pessoaJuridica}" />
</a:commandButton>

Teoricamente teria que funcionar não é? Porque eu estou tentando “setar” um objeto pai na filha. Será que não tem um jeitinho para isso funcionar?

N

Andei pesquisando melhor e acho que assim esta mais certo:

<a:commandButton value="Próxima etapa" action="#{pessoaMB.etapa2}" rendered="#{pessoaMB.isPessoaJuridica}">
       <f:param name="param" value="#{pessoaMB.pessoa}" />
</a:commandButton>

E no bean está assim:

public void etapa2(){
		setEtapa2(true);
		setEtapa1(false);
		pessoaJuridica = (PessoaJuridica) FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "param", Pessoa.class);
		log.info("Nome da pessoa jurídica "+pessoaJuridica.getNome());
	}

Mas está acontecendo o erro:

java.lang.IllegalArgumentException: Cannot convert param of type class java.lang.String to class com.ifpr.pessoa.Pessoa
	at org.jboss.el.lang.ELSupport.coerceToType(ELSupport.java:358)
	at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:188)
	at org.jboss.seam.jsf.SeamApplication.evaluateExpressionGet(SeamApplication.java:400)
	at com.ifpr.pessoaJuridica.mb.PessoaJuridicaMB.etapa2(PessoaJuridicaMB.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
	at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
	at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28)
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
	at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:77)
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
	at org.jboss.seam.core.ConversationInterceptor.aroundInvoke(ConversationInterceptor.java:65)
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
	at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44)
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
	at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
	at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:185)
	at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:103)
	at com.ifpr.pessoaJuridica.mb.PessoaJuridicaMB_$$_javassist_3.etapa2(PessoaJuridicaMB_$$_javassist_3.java)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:329)
	at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:342)
	at org.jboss.el.parser.AstPropertySuffix.invoke(AstPropertySuffix.java:58)
	at org.jboss.el.parser.AstValue.invoke(AstValue.java:96)
	at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	... 55 more

Alguém sabe me dizer como resolver isso?

Criado 10 de agosto de 2011
Ultima resposta 13 de ago. de 2011
Respostas 8
Participantes 2