Usar a SuperClasse para fazer login com o jsf e com hibernate

2 respostas
java
michelJ

Ola a todos e obrigado antecipadamente pela atenção,

Eu tenho uma superclasse usuário de onde eu herdo contador e proprietário e estou usando notações do hibernate através da estrategia “strategy=InheritanceType.SINGLE_TABLE”.
Minha dificuldade é que estou tentando realizar o login atraves da superclasse, descobrir se é instanceof de Contador ou Proprietario, so que o JSF parece não reconhecer a minha superclasse para ser usada no managedBean.

Segue código abaixo

import java.io.Serializable;

import javax.persistence.CascadeType;

import javax.persistence.DiscriminatorColumn;

import javax.persistence.DiscriminatorType;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

import javax.persistence.Inheritance;

import javax.persistence.InheritanceType;

import javax.persistence.OneToOne;

@Entity

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name=tipo_usuario,

discriminatorType=DiscriminatorType.STRING)

@DiscriminatorValue(usu)

public class Usuario implements Serializable{

/**

*

*/

private static final long serialVersionUID = 8317918183498048165L;

@Id

private String cpf;

private String rg;

private String nome;

@OneToOne(cascade=CascadeType.ALL)

private Endereco endereco;

private String senha;
public Usuario() {
	
}

public String getCpf() {
	return cpf;
}
public void setCpf(String cpf) {
	this.cpf = cpf;
}
public String getRg() {
	return rg;
}
public void setRg(String rg) {
	this.rg = rg;
}
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public Endereco getEndereco() {
	return endereco;
}
public void setEndereco(Endereco endereco) {
	this.endereco = endereco;
}
public String getSenha() {
	return senha;
}
public void setSenha(String senha) {
	this.senha = senha;
}
</code>

Classe Contador que extende usuario

import java.io.Serializable;
import java.util.List;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.OneToMany;

@Entity

@DiscriminatorValue(cont)

public class Contador extends Usuario implements Serializable{

/**

*

*/

private static final long serialVersionUID = 5147775612439546148L;
private String crc;
@OneToMany(targetEntity=Empresa.class, mappedBy="contador",fetch=FetchType.EAGER)
private List<Empresa> listEmpresa;

public Contador(){
	
}

public String getCrc() {
	return crc;
}

public void setCrc(String crc) {
	this.crc = crc;
}

public List<Empresa> getListEmpresa() {
	return listEmpresa;
}

public void setListEmpresa(List<Empresa> listEmpresa) {
	this.listEmpresa = listEmpresa;
}

}

Classe proprietario extends usuario

@Entity
@DiscriminatorValue(“prop”)
public class Proprietario extends Usuario implements Serializable{
/**
*
*/
private static final long serialVersionUID = 3624660381176899371L;

@OneToMany(targetEntity=Empresa.class, mappedBy="proprietario", fetch=FetchType.EAGER)
private List<Empresa> listEmpresa;

public Proprietario(){
	
}

public List<Empresa> getListEmpresa() {
	return listEmpresa;
}

public void setListEmpresa(List<Empresa> listEmpresa) {
	this.listEmpresa = listEmpresa;
}

}

ManagedBean da minha superclasse que esta dando problemas:

import java.io.IOException;

import javax.annotation.ManagedBean;

import javax.faces.bean.*;

import javax.faces.context.FacesContext;
import com.dao.UsuarioDao;

import com.model.Contador;

import com.model.Proprietario;

import com.model.Usuario;
@ManagedBean

@SessionScoped

public class UsuarioBean {

private Usuario usu = new Usuario();

private UsuarioDao usuDao = new UsuarioDao();

private Contador contador = new Contador();

private Proprietario proprietario = new Proprietario();
public Usuario getUsuario() {
	if(this.usu == null){
		this.usu = new Usuario();
	}
	return usu;
}

public void setUsuario(Usuario usuario) {
	this.usu = usuario;
}

public Contador getContador() {
	return contador;
}

public void setContador(Contador contador) {
	this.contador = contador;
}

public Proprietario getProprietario() {
	return proprietario;
}

public void setProprietario(Proprietario proprietario) {
	this.proprietario = proprietario;
}

public void logar(Usuario usu){
	usuDao.logar(usu.getCpf(),usu.getSenha());
	String page = null;
	if(usu instanceof Proprietario){
		proprietario = (Proprietario) usu;
		page = "pgprop.jsf";
	}else if (usu instanceof Contador) {
		contador = (Contador) usu;
		page = "pgcont.jsf";
	}else{
		page = "pgerror.jsf";
	}
	try {
		FacesContext.getCurrentInstance().getExternalContext().redirect(page);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

}

Minha classe dao para usuario:

import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction;

import com.model.HibernateUtil;
import com.model.Usuario;

public class UsuarioDao {

public Usuario logar(String Cpf, String Senha){
	Usuario usu;
	Session session = HibernateUtil.getSessionFactory().openSession();
	Transaction t = session.beginTransaction();
	Query query = session.createQuery("from Usuario where cpf = :cpf and senha = :senha");
	query.setParameter("cpf", Cpf);
	query.setParameter("senha", Senha);
	usu = (Usuario)query.uniqueResult(); 
	System.out.println("Nome: "+usu.getNome());
	 t.commit();
	session.close();
    return usu;
}

}

Minha tela de login:

identar texto pre-formatado em 4 espaços
<h:body>
<r:panel title=“Sistema de Escrituração Contabil 1.0”>
Sistema de Escrituração Contabil 1.0
</r:panel>
<h:form>
<h:outputLabel value=“Login:” for=“cpf”/>
<h:inputText id=“cpf” value="#{usuarioBean.usu.cpf}"/>

<h:outputLabel value=“Senha:” for=“senha”/>
<h:inputSecret id=“senha” value="#{usuarioBean.usu.senha}"/>

<h:outputLabel value=“Tipo de Usuario:” for=“tpusu”/>
<h:selectOneMenu>
<f:selectItem itemLabel=“Contador” itemValue=“cont”/>
<f:selectItem itemLabel=“Proprietario” itemValue=“prop”/>
<f:selectItem itemLabel=“Administrador” itemValue=“adm”/>
</h:selectOneMenu>

<h:commandButton value=“Logar” action="#{usuarioBean.logar()}"/> <h:commandButton value=“Cancelar” />

E esse é o erro que encontro quando tento realizar o login:

exception javax.servlet.ServletException: /index.xhtml @20,55 value="#{usuarioBean.usu.cpf}": Target Unreachable, identifier 'usuarioBean' resolved to null javax.faces.webapp.FacesServlet.service(FacesServlet.java:659) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

javax.el.PropertyNotFoundException: /index.xhtml @20,55 value="#{usuarioBean.usu.cpf}": Target Unreachable, identifier usuarioBean resolved to null

com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)

com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)

javax.faces.component.UIInput.getConvertedValue(UIInput.java:1046)

javax.faces.component.UIInput.validate(UIInput.java:976)

javax.faces.component.UIInput.executeValidate(UIInput.java:1249)

javax.faces.component.UIInput.processValidators(UIInput.java:712)

javax.faces.component.UIForm.processValidators(UIForm.java:253)

javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)

javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)

javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1195)

com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)

com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)

javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

javax.el.PropertyNotFoundException: Target Unreachable, identifier usuarioBean resolved to null

org.apache.el.parser.AstValue.getTarget(AstValue.java:97)

org.apache.el.parser.AstValue.getType(AstValue.java:81)

org.apache.el.ValueExpressionImpl.getType(ValueExpressionImpl.java:171)

com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:98)

com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)

javax.faces.component.UIInput.getConvertedValue(UIInput.java:1046)

javax.faces.component.UIInput.validate(UIInput.java:976)

javax.faces.component.UIInput.executeValidate(UIInput.java:1249)

javax.faces.component.UIInput.processValidators(UIInput.java:712)

javax.faces.component.UIForm.processValidators(UIForm.java:253)

javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)

javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)

javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1195)

com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)

com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)

javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.55 logs.

Pelo que eu vi estou usando as EL de forma correta.

Alguem sabe o que esta acontecendo?

2 Respostas

michelJ

Ninguem pode me ajudar?

michelJ

Obrigado a todos que me ajudaram nesse forum era uma duplicidade do objeto usuario que estava duplamente instanciado na minha classe
Ate

Criado 15 de janeiro de 2016
Ultima resposta 17 de jan. de 2016
Respostas 2
Participantes 1