Linha em branco no SelectOneMenu

22/04/2010

0

Galera, estou trabalhando com JSF, Hibernate e Spring, e preciso inserir linhas em branco em vários SelectOneMenu q tenho em minhas páginas, na verdade como inserir a linha eu sei, o problema é quando vou gravar:

erro:
javax.servlet.ServletException: #{profissionalController.salvar}: javax.persistence.EntityNotFoundException: Unable to find br.org.creapi.entities.Sexo with id


nesse caso especifico, estou trabalhando com o SelectOneMenu de Sexo e é claro q ele não vai encontrar um Sexo com um id nulo q é quando eu seleciono a linha em branco.

xhtml do selectonemenu:
<h:outputText value="Sexo" styleClass="saidaTexto" for="sexo" />    
 <h:selectOneMenu id="sexo"    
     value="#{profissionalController.profissional.sexo.idsexo}">    
     <f:selectItem itemValue="" itemLabel=""/>    
     <f:selectItems value="#{profissionalController.sexo}" />    
 </h:selectOneMenu>    
<h:message for="sexo" styleClass="message" />  

José Filho

José Filho

Responder

Posts

22/04/2010

Angelo Santos

José,


      Vc poderia definir uma outra opção no combo relacionado ao sexo. Ex: 'Outro'.

      Ou se quiser, vc pode definir na tabela sexo do banco como 'NULL';

     Espero ter ajudado.
Responder

22/04/2010

José Filho

Na verdade não gostaria de definir uma outra opção - já tinha pensado nisso - mas se não for o jeito...

No banco já está null
Responder

29/04/2010

Dyego Carmo

Cole aqui o codigo do seu bean e o codigo da pagina...

Assim posso analisar corretamente !

Responder

29/04/2010

José Filho

Bom Diego, antes de mais nada gostaria de dizer q sou assinante Java Magazine e já assisti há muitas vídeo-aulas suas, parabéns.Quanto ao meu problema, vou tentar resumir, basicamente é como trabalhar com uma ou duas entidade(s) q se relacionam, mas, cuja chave estrangeira não é obrigatória, ou seja, pode ser null.

Possuo a tabela Pessoa e Profissional, na tabela Profissional, tem um campo Assistente, q é um Profissional já previamente cadastrado, mas q não é obrigatório, ou seja, um Profissional pode ou não ter um Assistente, então, temos um auto-relacionamento. Da mesma forma, possuo outras entidades q se relacionam com Profissional, como Sexo, por exemplo, q é escolhido através de um selectonemenu no xhtml, no entanto gostaria que quando fosse cadastrar um novo Profissional, tanto o Assistente, quanto o Sexo, pudessem ficar em branco(nulo) e ai meu amigo, começa a baderna, agora os códigos:

Pessoa
@Entity
@Table(name = "pessoa")
@Inheritance(strategy=InheritanceType.JOINED)
public class Pessoa implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private String codigo;
    private String cpfcnpj;
    private String nome;
    private String email;
    private Profissional profissional;

    public Pessoa() {
    }

    public Pessoa(String codigo) {
        this.codigo = codigo;
    }

    @Id
    @Column(name = "codigo", unique = true, nullable = false)
    public String getCodigo() {
        return this.codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    @Column(name = "cpfcnpj")
    public String getCpfcnpj() {
        return this.cpfcnpj;
    }

    public void setCpfcnpj(String cpfcnpj) {
        this.cpfcnpj = cpfcnpj;
    }

    @Column(name = "nome")
    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Column(name = "email", length = 60)
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @OneToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    @PrimaryKeyJoinColumn
    public Profissional getProfissional() {
        return this.profissional;
    }

    public void setProfissional(Profissional profissional) {
        this.profissional = profissional;
    }

}


Profissional - só o necessário
@Entity
@Table(name = "profissional")
@PrimaryKeyJoinColumn(name = "codigo")
public class Profissional extends Pessoa implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private Sexo sexo;
    private Tiporegistro tiporegistro;
    private Situacaoregistro situacaoregistro;
    private Profissional assistente;
    private Date datanascimento;

    public Profissional() {

    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idsexo", nullable = true)
    public Sexo getSexo() {
        return this.sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idtiporegistro", nullable = false)
    public Tiporegistro getTiporegistro() {
        return this.tiporegistro;
    }

    public void setTiporegistro(Tiporegistro tiporegistro) {
        this.tiporegistro = tiporegistro;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idsituacaoregistro", nullable = false)
    public Situacaoregistro getSituacaoregistro() {
        return this.situacaoregistro;
    }

    public void setSituacaoregistro(Situacaoregistro situacaoregistro) {
        this.situacaoregistro = situacaoregistro;
    }

    @ManyToOne(fetch = FetchType.EAGER, optional=true)
    @JoinColumn(name = "rnpassistente", nullable = true)
    public Profissional getAssistente() {
        return assistente;
    }

    public void setAssistente(Profissional assistente) {
        this.assistente = assistente;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "datanascimento", length = 13)
    public Date getDatanascimento() {
        return this.datanascimento;
    }

    public void setDatanascimento(Date datanascimento) {
        this.datanascimento = datanascimento;
    }

}


Sexo
@Entity
@Table(name = "sexo")
public class Sexo implements Serializable {

    private static final long serialVersionUID = 1L;
    private String idsexo;
    private String descricao;
    private Set<Profissional> profissionais;

    public Sexo() {
    }

    public Sexo(String idsexo) {
        this.idsexo = idsexo;
    }

    public Sexo(String idsexo, String descricao, Set<Profissional> profissionais) {
        this.idsexo = idsexo;
        this.descricao = descricao;
        this.profissionais = profissionais;
    }

    @Id
    @Column(name = "idsexo", unique = true, nullable = false, length = 1)
    public String getIdsexo() {
        return this.idsexo;
    }

    public void setIdsexo(String idsexo) {
        this.idsexo = idsexo;
    }

    @Column(name = "descricao", length = 10)
    public String getDescricao() {
        return this.descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "sexo")
    public Set<Profissional> getProfissionais() {
        return this.profissionais;
    }

    public void setProfissionais(Set<Profissional> profissionais) {
        this.profissionais = profissionais;
    }
}


ProfissionalController - como é grande, vou colocar somente o q acho pertinente
@Controller("profissionalController")
@Scope("session")
public class ProfissionalController {

private Profissional profissional;
private Pessoa pessoa;

@Resource
private DaoGenerico<Profissional, String> profissionalDao;

@Resource
private DaoGenerico<Sexo, String> sexoDao;

private DataModel model;

private Map<String, Object> sexoItem = null;
private Map<String, Object> tiporegistroItem = null;
private Map<String, Object> situacaoregistroItem = null;

public ProfissionalController() {
        this.profissional = new Profissional();
}

public Map<String, Object> getSexo() {

        sexoItem = new LinkedHashMap<String, Object>();

        sexoItem.put("", "");
        for (Iterator<?> iter = sexoDao.todos(2).iterator(); iter.hasNext();) {
            Sexo c = (Sexo) iter.next();
            sexoItem.put(c.getDescricao(), c.getIdsexo());// label,value
        }

        return sexoItem;
}

public Map<String, Object> getTipoRegistro() {

        tiporegistroItem = new LinkedHashMap<String, Object>();

        for (Iterator<?> iter = tiporegistroDao.todos(2).iterator(); iter
                .hasNext();) {
            Tiporegistro c = (Tiporegistro) iter.next();
            tiporegistroItem.put(c.getDescricao(), c.getIdtiporegistro());// label,value
        }

        return tiporegistroItem;
}

public Map<String, Object> getSituacaoRegistro() {

        situacaoregistroItem = new LinkedHashMap<String, Object>();

        for (Iterator<?> iter = situacaoregistroDao.todos(2).iterator(); iter
                .hasNext();) {
            Situacaoregistro c = (Situacaoregistro) iter.next();
            situacaoregistroItem.put(c.getDescricao(), c
                    .getIdsituacaoregistro());// label,value
        }

        return situacaoregistroItem;
}

public String novo() {

        this.profissional = new Profissional();
        this.profissional.setTiporegistro(new Tiporegistro());
        getTipoRegistro();
        this.profissional.setSituacaoregistro(new Situacaoregistro());
        getSituacaoRegistro();
        this.profissional.setSexo(new Sexo());
        getSexo();
        this.profissional.setAssistente(new Profissional());
        pessoa = new Pessoa();

        novoRegistro = true;

        return "formProfissional";
}

public String salvar() {
        //isso já foi gambiarra tentando corrigir o problema
        if (profissional.getSexo().getIdsexo().equals("")) {
            profissional.setSexo(null);
        } else {
            profissional.setSexo(sexoDao.pesquisarPorId(profissional.getSexo()
                    .getIdsexo()));
        }

        if (profissional.getAssistente().getCodigo().equals("")) {
            profissional.setAssistente(null);
        } else {
            profissional.setAssistente(profissionalDao
                    .pesquisarPorId(profissional.getAssistente().getCodigo()));
        }

        //aqui começa o salvar de verdade
        if (novoRegistro == true) {
            profissionalDao.salvar(profissional);
            FacesUtils.mensErro("Registro Salvo com Sucesso!");
        } else {
            profissionalDao.atualizar(profissional);
            FacesUtils.mensErro("Registro Atualizado com Sucesso!");
        }
        return "sucesso";
}

public String editar() {

        FacesContext context = FacesContext.getCurrentInstance();
        Profissional profissional = (Profissional) context.getExternalContext()
                .getRequestMap().get("item");

        //
        if (profissional.getSexo() == null) {
            profissional.setSexo(new Sexo());
        }
        if (profissional.getAssistente() == null) {
            profissional.setAssistente(new Profissional());
        }
        //

        //o salvar era pra ser só essa parte aqui
        setProfissional(profissional);
        return "formProfissional";
}



formProfissional.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:stella="http://stella.caelum.com.br/faces"
    xmlns:c="http://java.sun.com/jstl/core">

<ui:composition template="template.xhtml">
<a4j:keepAlive beanName="profissionalController" />
<ui:define name="titulo">Profissional</ui:define>
<ui:define name="content">
<div id="formulario">
<h1>Cadastrar Profissional</h1>
<hr />
<br />
<fieldset><legend>Dados Pessoais</legend> <h:panelGrid
    columns="3" styleClass="panelGrid"
    columnClasses="pgColumn1,pgColumn2,pgColumn3">

<h:outputText value="Sexo" styleClass="saidaTexto" for="sexo" />
<h:selectOneMenu id="sexo"
    value="#{profissionalController.profissional.sexo.idsexo}">
    <f:selectItems value="#{profissionalController.sexo}" />
</h:selectOneMenu>
<h:message for="sexo" styleClass="message" />

<h:outputText value="RNP Assistente" styleClass="saidaTexto"
    for="rnpassistente" />
<h:inputText id="rnpassistente"
    value="#{profissionalController.profissional.assistente.codigo}" size="15" >
    <a4j:support event="onblur" reRender="resultado" />
</h:inputText>
<h:message for="rnpassistente" styleClass="message" />


Bom, quanto a essas linhas do editar:

if (profissional.getSexo() == null) {
   profissional.setSexo(new Sexo());
}
if (profissional.getAssistente() == null) {
   profissional.setAssistente(new Profissional());
}

é uma gambiarra eu sei, ao fazer uma pesquisa pelo profissional numa tela de consulta, quando clico no registro exibido em um ExtendedDataTable, para ser exibido no formProfissional.xhtml, já dá um erro:

Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.org.creapi.entities.Profissional.assistente -> br.org.creapi.entities.Profissional
    at org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:387)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:172)
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:451)
    at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:158)
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
    at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:826)
    at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:818)
    at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:357)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
    at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
    at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
    at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1175)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1251)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236)
    ... 67 more


não entendo porque ele se refere a salvar, já q só estou tentando visualizar os dados;

De outra forma se tiro as referidas linhas, consigo visualizar as informações do registro, no entanto ao tentar salvá-lo (tanto faz se é um novo ou edição), outro erro, mas só quando não há um assistente já associado ao profissional e sexo não definido:

javax.servlet.ServletException: /formProfissional.xhtml @398,81 value="#{profissionalController.profissional.assistente.codigo}": Target Unreachable, 'assistente' returned null
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:277)
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

root cause

javax.el.PropertyNotFoundException: /formProfissional.xhtml @398,81 value="#{profissionalController.profissional.assistente.codigo}": Target Unreachable, 'assistente' returned null
    com.sun.facelets.el.TagValueExpression.getType(TagValueExpression.java:62)
    com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:92)
    javax.faces.component.UIInput.getConvertedValue(UIInput.java:942)
    javax.faces.component.UIInput.validate(UIInput.java:868)
    javax.faces.component.UIInput.executeValidate(UIInput.java:1072)
    javax.faces.component.UIInput.processValidators(UIInput.java:672)
    javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058)
    javax.faces.component.UIForm.processValidators(UIForm.java:234)
    org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:447)
    org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:240)
    org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463)
    com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)


e é isso, desculpe a quantidade de informação, mas, acho necessário para q vc possa analizar o problema como um todo e apesar de minha dúvida inicial ser relacionada ao sexo, o problema do Assistente é praticamente igual, pq se tirar toda referencia do projeto ao assistente, o erro dá no sexo.

Obrigado
Responder

30/04/2010

José Filho

Estou precisando muito de ajuda.
Responder

30/04/2010

Dyego Carmo

É ai que voce se engana...

O que voce fez nao foi um xunxo...

Somente criando o objeto o JSF vai conseguir acessa-lo...

para evitar este IF voce pode colocar os creates DIRETO na classe de pessoa...


onde estiver por exemplo:


private Sexo sexo;

ponha:

private Sexo sexo = new Sexo();


se vc estiver utilizando Java EE 6 bote um @Valid em cima , assim ele vai validar se o Sexo é um objeto valido :)


Responder

03/05/2010

José Filho

Diego, pra te dizer a verdade, não sei qual a versão do Java EE estou usando, já procurei nas propriedades do Projeto, mas, não encontro; as tecnologias utilizadas são: JSF, Spring, Hibernate; Servelt Container: Tomcat; Eclipse IDE for Java EE 3.5.2 com JBoss Tools;

Eu pergunto a você, mesmo utilizando só o Tomcat, posso fazer uso do Java EE? Ou obrigatoriamente tenho q ter um Servidor de Aplicações (GlassFish, JBoss);

Será q essa versão do Eclipse tem suporte ao Java EE 6?

Estou te perguntando isso pq coloquei a anotação @Valid, mas não foi reconhecida, ou o Eclipse não dá suporte ao Java EE 6 ou o meu projeto não está fazendo uso do Java EE 6;

Tem alguma outra forma de resolver meu problema, sem o @Valid?

Obrigado.
Responder

03/05/2010

Dyego Carmo

Sem @Valid

onde estiver por exemplo:


private Sexo sexo;

ponha:

private Sexo sexo = new Sexo();
Responder

03/05/2010

José Filho

Diego, tire o if referente ao Sexo do método editar e substitui o q vc disse na classe Profissional:

private Sexo sexo = new Sexo();

quando vou gravar, o erro:

javax.el.PropertyNotFoundException: /formProfissional.xhtml @131,64 value="#{profissionalController.profissional.sexo.idsexo}": Target Unreachable, 'sexo' returned null
	com.sun.facelets.el.TagValueExpression.getType(TagValueExpression.java:62)
	com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:92)
	com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectOneValue(MenuRenderer.java:188)
	com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:301)
	javax.faces.component.UIInput.getConvertedValue(UIInput.java:942)
	javax.faces.component.UIInput.validate(UIInput.java:868)
	javax.faces.component.UIInput.executeValidate(UIInput.java:1072)
	javax.faces.component.UIInput.processValidators(UIInput.java:672)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058)
	javax.faces.component.UIForm.processValidators(UIForm.java:234)
	org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:447)
	org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:240)
	org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463)
	com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

Responder

04/05/2010

Dyego Carmo

Muito estranho , o erro nao bate...

Cole aqui sua nova classe Profissional.

Responder

05/05/2010

José Filho

Profissional

package br.org.creapi.entities;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "profissional")
@PrimaryKeyJoinColumn(name = "codigo")
public class Profissional extends Pessoa implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private Sexo sexo = new Sexo();
    private Tiporegistro tiporegistro;
    private Situacaoregistro situacaoregistro;
    private Profissional assistente;
    private Date datanascimento;

    public Profissional() {

    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idsexo", nullable = true)
    public Sexo getSexo() {
        return this.sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idtiporegistro", nullable = false)
    public Tiporegistro getTiporegistro() {
        return this.tiporegistro;
    }

    public void setTiporegistro(Tiporegistro tiporegistro) {
        this.tiporegistro = tiporegistro;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idsituacaoregistro", nullable = false)
    public Situacaoregistro getSituacaoregistro() {
        return this.situacaoregistro;
    }

    public void setSituacaoregistro(Situacaoregistro situacaoregistro) {
        this.situacaoregistro = situacaoregistro;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "datanascimento", length = 13)
    public Date getDatanascimento() {
        return this.datanascimento;
    }

    public void setDatanascimento(Date datanascimento) {
        this.datanascimento = datanascimento;
    }


    @ManyToOne(fetch = FetchType.EAGER, optional=true)
    @JoinColumn(name = "rnpassistente", nullable = true)
    public Profissional getAssistente() {
        return assistente;
    }


    public void setAssistente(Profissional assistente) {
        this.assistente = assistente;
    }
    
}


O editar ficou assim:
    public String editar() {
        novoRegistro = false;
        FacesContext context = FacesContext.getCurrentInstance();
        Profissional profissional = (Profissional) context.getExternalContext()
                .getRequestMap().get("item");

//        if (profissional.getSexo() == null) {
//            profissional.setSexo(null);
//        }
        if (profissional.getAssistente() == null) {
            profissional.setAssistente(null);
        }
        setProfissional(profissional);
        return "formProfissional";
    }


e o salvar, com ou sem o bloco comentado, dá erro:

    public String salvar() {
//        if (profissional.getSexo().getIdsexo().equals("")) {
//            profissional.setSexo(null);
//        } else {
//            profissional.setSexo(sexoDao.pesquisarPorId(profissional.getSexo()
//                    .getIdsexo()));
//        }

        if (profissional.getAssistente().getCodigo().equals("")) {
            profissional.setAssistente(null);
        } else {
            profissional.setAssistente(profissionalDao
                    .pesquisarPorId(profissional.getAssistente().getCodigo()));
        }
        if (novoRegistro == true) {
            profissionalDao.salvar(profissional);
            FacesUtils.mensErro("Registro Salvo com Sucesso!");
        } else {
            profissionalDao.atualizar(profissional);
            FacesUtils.mensErro("Registro Atualizado com Sucesso!");
        }

        return "sucesso";

    }

 
Responder

06/05/2010

Dyego Carmo

Comente e cole o erro aqui...

FULL...

Responder

07/05/2010

José Filho

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.



exception

javax.servlet.ServletException: /formProfissional.xhtml @131,64 value="#{profissionalController.profissional.sexo.idsexo}": Target Unreachable, 'sexo' returned null
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:277)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)



root cause

javax.el.PropertyNotFoundException: /formProfissional.xhtml @131,64 value="#{profissionalController.profissional.sexo.idsexo}": Target Unreachable, 'sexo' returned null
	com.sun.facelets.el.TagValueExpression.getType(TagValueExpression.java:62)
	com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:92)
	com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectOneValue(MenuRenderer.java:188)
	com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:301)
	javax.faces.component.UIInput.getConvertedValue(UIInput.java:942)
	javax.faces.component.UIInput.validate(UIInput.java:868)
	javax.faces.component.UIInput.executeValidate(UIInput.java:1072)
	javax.faces.component.UIInput.processValidators(UIInput.java:672)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058)
	javax.faces.component.UIForm.processValidators(UIForm.java:234)
	org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:447)
	org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:240)
	org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463)
	com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)


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

Responder

14/05/2010

Dyego Carmo

Deixe o IF que tá parecendo uma solucao menos sinistra hehe...

Que erro estranho !
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar