Ajuda JSF 2.0 e h:selectOneMenu

21 respostas
robinsonbsilva

Senhores(ritas),

Possuo um combobox que é populado por dados de uma tabela no BD.

//.xhtml

<h:outputLabel for="empresa" value="#{rotulo.empresa}" > </h:outputLabel>
	<h:selectOneMenu id="empresa" validatorMessage="Empresa obrigatória!" value="#{usuarioBean.usuario.empresa}" required="true" style="width: 370px;">
		<f:selectItems value="#{usuarioBean.empresas}" var="empresa" itemLabel="#{empresa.razaoSocial}" itemValue="#{empresa.idEmpresa}" />
	</h:selectOneMenu>

//.classes

@Entity
@Table(name = "pj")
public class Empresa implements Serializable {

	private static final long serialVersionUID = -612043523887259306L;

	@Id
	@Column(name = "id_pj")
	private Long idEmpresa;

	@Column(name = "razaosocial")
	private String razaoSocial;

	@Column(name = "nomefantasia")
	private String nomeFantasia;

	@Column(name = "cnpj")
	private String cnpj;

       //get's and seter's
}

@Entity
@Table(schema ="colocation", name = "usuario")
public class Usuario implements Serializable{

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name = "id_usuario")
	private Long idUsuario;

	@OneToOne(cascade = { CascadeType.ALL })
	@JoinColumn(name = "id_empresa")
	private Empresa empresa;

       //get's and seter's
}

@ManagedBean(name = "usuarioBean")
@SessionScoped
public class UsuarioBean {

       private Usuario usuario;

       //get's and seter's

	public List<Empresa> getEmpresas() {
		
		EmpresaFacade empresaService = new EmpresaFacade();
		try {
			return empresaService.list((long)-1, "razaoSocial", 1, 10);
		} catch (DAOException e) {
			e.printStackTrace();
		}

		return new ArrayList<Empresa>();
	}
}

Bom, o erro ocorre na fase de “validação”. no momento que "submeto o form.

o seguinte a mensagem é exibida:
Erro de conversão ao definir o valor ‘54.385.620/0002-04’ para ‘null Converter’.

Desde já agradeço!

21 Respostas

Richard_Mendes_Madur

Cara, em JSF 1.2, quando vou popular um combo, crio um método que retorna uma lista de SelectItems.
Não se se o erro é esse, mas tente trocar a assinatura do seu método para algo mais ou menos assim:

public List<SelectItem> getEmpresas() {
   List<SelectItem> items = new ArrayList<SelectItem>();
   ...
   return items;
}

Espero que ajude!
Valeu!

robinsonbsilva

Fala jovem,

Então, estou usando jsf 2.

Eu fiz esse método retornando um select Item também…

public List&lt;SelectItem&gt; getEmpresas() {

		List&lt;SelectItem&gt; empresas = new ArrayList&lt;SelectItem&gt;();
		EmpresaFacade empresaService = new EmpresaFacade();

		try {
			for (Empresa e : empresaService.list((long)-1, "razaoSocial", 1, 10)) {
				SelectItem s = new SelectItem(e, e.getRazaoSocial());
				empresas.add(s);
				e = null;
			}
		} catch (DAOException e) {
			e.printStackTrace();
		}
		return empresas;
	}

acredito que essa validação está “falhando” no momento de fazer a ligação o managedbean.

o erro apresentado foi o mesmo!!!

Erro de conversão ao definir o valor ‘61.486.650/0001-83’ para ‘null Converter’.

renato.dosantos

Seu erro é esse:

value="#{usuarioBean.usuario.empresa}"

Sua variavel usuario não esta estaciada. Logo quando vc referencia com .empresa ele tenta acessa uma area que não exite. recomento vc pegar o id da empresa e inserir no atributo da classe e depois fazer um busca pela empresa no banco e só depois atribuir a empresa a usuario.empresa.

robinsonbsilva

Pior que ela é instanciada.

public String prepareAdd() {
		
		setUsuario(new Usuario()); 

		return "/pages/usuario/create.jsf";
		
	}

Acredito que o problema é ligar o valor selecionado do combobox com o atributo usuario.empresa

Richard_Mendes_Madur

Vi que a sua classe Usuario não instancia um objeto empresa…
Por acaso não seria necessário instanciar também a variável empresa, dentro de usuário?

robinsonbsilva

Então, até instanciando especificamente a classe Empresa.

@Entity
@Table(schema ="colocation", name = "usuario")
public class Usuario implements Serializable{

	private static final long serialVersionUID = 330362572776429712L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name = "id_usuario")
	private Long idUsuario;

	@OneToOne(cascade = { CascadeType.ALL })
	@JoinColumn(name = "id_empresa")
	private Empresa empresa = new Empresa();

	@Column(name = "nome")
	private String nome;

	@Column(name = "email")
	private String email;

	@Column(name = "senha")
	private String senha;
	
	@Column(name = "excluido")
	private int excluido;

	//getter's and setter's

}

Não está rolando mesmo…

ricardo13

olá,

Bom, eu acredito que seja esse o seu problema.
Nakele código apresentado vc inseriu a seguinte linha

SelectItem s = new SelectItem(e, e.getRazaoSocial());

Percebe-se que o primeiro parâmetro é um objeto. Para isso, vc precisará construir uma classe que implementa Converter e implementar os métodos getAsObject() e getAsString().

Ricardo

robinsonbsilva

Fala Ricardo,

Então, implementei um Converter e o mesmo erro ocorre. O pior é que o converter “retorna” o objeto corretamente.

@FacesConverter(value="empresaConverter", forClass=Empresa.class) 
public class EmpresaConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
		 Empresa empresa = null;
		try{
			empresa = new EmpresaFacade().load(Long.valueOf(arg2));
		}catch (DAOException e) {
		}

		return empresa;
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
		return String.valueOf(((Empresa) arg2).getIdEmpresa());
	}

}
ricardo13

Só para constar.

Você tem a váriavel “empresas” no MB ??

Ricardo

robinsonbsilva

Fala seu Ricardo,

Então, tem sim!

@ManagedBean(name = "usuarioBean")
@SessionScoped
public class UsuarioBean {

    private Usuario usuario;
    private List&lt;Empresa&gt; empresas;

	public UsuarioBean(){
	}

	/******************************************/
	/******************************************/
	/******************************************/

	public String save() {
		
		try {
			UsuarioFacade usuarioService = new UsuarioFacade();
			usuarioService.save(getUsuario());
		} catch (DAOException e) {
			e.printStackTrace();
			return "erro";
		}

		return list();
	}

	public String delete() {

		try {
			UsuarioFacade usuarioService = new UsuarioFacade();
			usuarioService.delete(getUsuario());
		} catch (DAOException e) {
			e.printStackTrace();
		}

		return list();
	}

	public String list() {
		return "/pages/usuario/show.jsf";
	}

	public String prepareAdd() {
		
		setUsuario(new Usuario()); 
		usuario.setEmpresa(FacesUtil.getEmpresa());

		return "/pages/usuario/create.jsf";
		
	}

	public String prepareEdit() {
        return "/pages/usuario/create.jsf";
	}

	public List&lt;Usuario&gt; getListUsuarios() {

		UsuarioFacade usuarioService = new UsuarioFacade();

		try {
			return usuarioService.list(-1l, "nome", 1, 10);
		} catch (DAOException e) {
			e.printStackTrace();
		}

		return new ArrayList&lt;Usuario&gt;();
	}

	/******************************************/
	/*************GET AND SETTERS**************/
	/******************************************/

	public List&lt;Empresa&gt; getEmpresas() {
		
		EmpresaFacade empresaService = new EmpresaFacade();
		try {
			return empresaService.list((long)-1, "razaoSocial", 1, 10);
		} catch (DAOException e) {
			e.printStackTrace();
		}

		return new ArrayList&lt;Empresa&gt;();
	}

	public void setEmpresas(List&lt;Empresa&gt; empresas) {
		this.empresas = empresas;
	}

	public Usuario getUsuario() {
		return usuario;
	}

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

	public String getUserLogged() {

		if(FacesUtil.getLoggedUser()== null)
			return "";

		return FacesUtil.getLoggedUser().getNome();
	}

	public String getEmpresaLogged() {

		if(FacesUtil.getLoggedUser()== null)
			return "";

		return FacesUtil.getEmpresa().getRazaoSocial();
	}

}
[code]
ricardo13

E se na sua tag

<f:selectItems value="#{usuarioBean.empresas}" var="empresa" itemLabel="#{empresa.razaoSocial}" itemValue="#{empresa.idEmpresa}" />

Você colocar somente

<f:selectItems value="#{usuarioBean.empresas}" />

E outra coisa, eu faria usando a classe SelectItem.
Dá uma olhada aki depois.

Ricardo

robinsonbsilva

da a mesma coisa!

está complicado! Na versão anterior JSF 1.x rolava dessa forma sem falhas, nem converter eu usava!
agora na versão 2, está ocorrendo esse erro no binding.

R

[quote=robinsonbsilva]Senhores(ritas),

Possuo um combobox que é populado por dados de uma tabela no BD.

//.xhtml

&lt;h:outputLabel for="empresa" value="#{rotulo.empresa}" &gt; &lt;/h:outputLabel&gt;
	&lt;h:selectOneMenu id="empresa" validatorMessage="Empresa obrigatória!" value="#{usuarioBean.usuario.empresa}" required="true" style="width: 370px;"&gt;
		&lt;f:selectItems value="#{usuarioBean.empresas}" var="empresa" itemLabel="#{empresa.razaoSocial}" itemValue="#{empresa.idEmpresa}" /&gt;
	&lt;/h:selectOneMenu&gt;

onde vc chama o converter?

robinsonbsilva

Dá uma olhada.

&lt;h:outputLabel for="empresa" value="#{rotulo.empresa}" &gt; &lt;/h:outputLabel&gt;
	&lt;h:selectOneMenu id="empresa" validatorMessage="Empresa obrigatória!" converter="empresaConverter" value="#{usuarioBean.usuario.empresa}" required="true" style="width: 370px;"&gt;
		&lt;f:selectItems value="#{usuarioBean.empresas}" var="empresa" itemLabel="#{empresa.razaoSocial}" itemValue="#{empresa}" /&gt;
	&lt;/h:selectOneMenu&gt;
R

isto acontece quando vc esta criando o usuario ou editando ele? ou em ambos

robinsonbsilva

Quando eu carrego a tela para edição, vem perfeito!
preenche o combo, seleciona o valor correto!

Agora no momento de “atualizar/salvar” ele reclama.

Fiz um “insert” manual só para testar.

R

se é na hora de salvar, acho que o required esta validando antes de setar a empresa no seu usuario. tenta colocar um valueChangeListener para ver se é isto ou então tenta usar um a4j:support event=“onchange”

robinsonbsilva

caramba…até tirando o required ele dá a mensagem de

" * form:empresa: Erro de validação: o valor não é válido "

robinsonbsilva

Nossa, funcionou sem converter…sem nada “de mais”

veja como:
de:

&lt;h:outputLabel for="empresa" value="#{rotulo.empresa}" &gt; &lt;/h:outputLabel&gt;  
   &lt;h:selectOneMenu id="empresa" validatorMessage="Empresa obrigatória!" converter="empresaConverter" value="#{usuarioBean.usuario.empresa}" required="true" style="width: 370px;"&gt;  
   &lt;f:selectItems value="#{usuarioBean.empresas}" var="empresa" itemLabel="#{empresa.razaoSocial}" itemValue="#{empresa}" /&gt;  
&lt;/h:selectOneMenu&gt;

para:

&lt;h:outputLabel for="empresa" value="#{rotulo.empresa}" &gt; &lt;/h:outputLabel&gt;
	&lt;h:selectOneMenu id="empresa" value="#{usuarioBean.usuario.empresa.idEmpresa}"&gt;
		&lt;f:selectItems value="#{usuarioBean.empresas}"/&gt;                                                                                                        
	&lt;/h:selectOneMenu&gt;
dreampeppers99

Incrivelmente o jeito “certo” não funciona daí quando você indica o id funciona… :shock:

A

estou com o mesmo problema. já tentei de tudo.
o problema dessa thread foi resolvido? como?
meu problema é exatamente esse:


não sei se é problema de validar, ou do JSF, ou do primefaces, ou de algum outro lugar que nem sei ainda!!! :slight_smile:

Agradeço qquer ajuda

Criado 11 de novembro de 2010
Ultima resposta 28 de jun. de 2012
Respostas 21
Participantes 7