Problema com <h:selectOneMenu> - Projeto com JSF 2 e PrimeFaces

Pessoal estou encontrando um problema para atualizar o <h:selectOneMenu> do meu cadastro.
Quando eu seleciono uma linha do grid, é atualizado o formulário de cima que possui basicamente as mesmas informações de cadastro que estão no grid.
Todas as informações são atualiazadas de forma correta exceto o bendito <h:selectOneMenu>.

A função deste selectOneMenu é para eu conseguir ligar o cadastro de um professor a um login de usuario previamnete cadastrado no sistema.

Abaixo mandarei todos os códigos que podem ser relevantes para que vc´s possam me ajudar. Obrigado !!! :slight_smile:

O código da view:

&lt;h:selectOneMenu id="comboUsuario" value="#{professorBean.professor.usuario}"  
                            style="width: 160px;"&gt;
							
     &lt;f:converter converterId="entityConverter" /&gt;
							
     &lt;f:selectItems value="#{usuarioBean.usuarios}" var="obj"
                            itemLabel="#{obj.login}" itemValue="#{obj}" /&gt;
&lt;/h:selectOneMenu&gt;

Código do Bean que trata o cadastro da view acima:

@ViewScoped
@ManagedBean
public class ProfessorBean implements Serializable{
	private static final long serialVersionUID = 2123732453953608376L;
	
	private List&lt;Professor&gt; professores;
	private Professor professor = new Professor();
	
	@PostConstruct
	public void carregaProfessores() {
		System.out.println("Carregando Professores...");
		professores = new DAO&lt;Professor&gt;(Professor.class).listaTodos();
	}
	
	public String grava() {		
		DAO&lt;Professor&gt; dao = new DAO&lt;Professor&gt;(Professor.class);
		if (getProfessor().getId()==null) {			
			//Se estiver adicionando coloca data de cadastro
			getProfessor().setDataCadastro(new Date(System.currentTimeMillis()));
			
			dao.adiciona(getProfessor());
		}	else {
			dao.atualiza(getProfessor());
		}
		this.setProfessor(new Professor());
		this.setProfessores(dao.listaTodos());
		return "";
	}
	
	public void remove() {
		DAO&lt;Professor&gt; dao = new DAO&lt;Professor&gt;(Professor.class);
		dao.remove(professor);
		this.professores = dao.listaTodos();
		this.professor = new Professor();		
	}	
	
	public List&lt;Professor&gt; getProfessores() {
		return professores;
	}
	public void setProfessores(List&lt;Professor&gt; professores) {
		this.professores = professores;
	}
	public Professor getProfessor() {
		return professor;
	}
	public void setProfessor(Professor professor) {
		this.professor = professor;
	}	
}

Código do bean onde estão a lista de usuarios que serão listados no meu <h:selectOneMenu>

@ViewScoped
@ManagedBean
public class UsuarioBean implements Serializable{

	private static final long serialVersionUID = -9125478541870676409L;
	
	private List&lt;Usuario&gt; usuarios;
	private Usuario usuario = new Usuario();
		
	public String grava() {		
		DAO&lt;Usuario&gt; dao = new DAO&lt;Usuario&gt;(Usuario.class);
		
		if (usuario.getId()==null) {
			dao.adiciona(usuario);
		}	else {
			dao.atualiza(usuario);
		}
		this.usuario = new Usuario();
		this.usuarios = dao.listaTodos();
		return "";
	}
	
	public void remove() {
		DAO&lt;Usuario&gt; dao = new DAO&lt;Usuario&gt;(Usuario.class);
		dao.remove(usuario);
		this.usuarios = dao.listaTodos();
		this.usuario = new Usuario();		
	}	
	
    public void onRowUnselect(UnselectEvent event) {         
    	FacesMessage msg = new FacesMessage("Usuário descelecionado", ((Usuario) event.getObject()).getLogin());        	
    	FacesContext.getCurrentInstance().addMessage(null, msg);
    	this.usuario = new Usuario();
    }  	
		
	@PostConstruct
	public void carregaUsuarios() {
		System.out.println("Carregando Usuarios...");
		usuarios = new DAO&lt;Usuario&gt;(Usuario.class).listaTodos();
	}
	
	public List&lt;Usuario&gt; getUsuarios() {
		return usuarios;
	}

	public Usuario getUsuario() {
		return this.usuario;
	}

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

Código do Converter necessário para tornar transparente a seleção do objeto e o binding com o Bean do cadastro

/**
 * Converter para entidades JPA. Baseia-se nas anotações @Id e @EmbeddedId para identificar o
 * atributo que representa a identidade da entidade. Capaz de detectar as anotações nas classes superiores.
 * 
 * @author Flávio Henrique
 * @version 1.0.3
 * @since 05/10/2010
 */
public class EntityConverter implements Converter {

	public Object getAsObject(FacesContext ctx, UIComponent component,
			String value) {
		if (value != null) {
			return component.getAttributes().get(value);
		}
		return null;
	}

	public String getAsString(FacesContext ctx, UIComponent component,
			Object obj) {
		if (obj != null && !&quot;&quot;.equals(obj)) {
			String id;
			try {
				id = this.getId(getClazz(ctx, component), obj);
				if (id == null) {
					id = &quot;&quot;;
				}
				id = id.trim();
				component.getAttributes().put(id,
						getClazz(ctx, component).cast(obj));
				return id;
			} catch (SecurityException e) {
				e.printStackTrace(); // seu log aqui
			} catch (IllegalArgumentException e) {
				e.printStackTrace(); // seu log aqui
			} catch (NoSuchFieldException e) {
				e.printStackTrace(); // seu log aqui
			} catch (IllegalAccessException e) {
				e.printStackTrace(); // seu log aqui
			}
		}
		return null;
	}

	/**
	 * Obtém, via expression language, a classe do objeto.
	 *
	 * @param FacesContext facesContext
	 * 
	 * @param UICompoment compoment
	 *     
	 * @return  Class&lt;?&gt;
	 */
	private Class&lt;?&gt; getClazz(FacesContext facesContext, UIComponent component) {
		return component.getValueExpression(&quot;value&quot;).getType(
				facesContext.getELContext());
	}


	/**
	 * Retorna a representação em String do retorno do método anotado com @Id ou @EmbeddedId do objeto.
	 *
	 * @param Class&lt;?&gt; clazz
	 *            
	 * @return  String
	 */
	public String getId(Class&lt;?&gt; clazz, Object obj) throws SecurityException,
			NoSuchFieldException, IllegalArgumentException,
			IllegalAccessException {

		List&lt;Class&gt;&lt;?&gt;&gt; hierarquiaDeClasses = this.getHierarquiaDeClasses(clazz);
		
		for (Class&lt;?&gt; classeDaHierarquia : hierarquiaDeClasses) {
			for (Field field : classeDaHierarquia.getDeclaredFields()) {
				if ((field.getAnnotation(Id.class)) != null
						|| field.getAnnotation(EmbeddedId.class) != null) {
					Field privateField = classeDaHierarquia
							.getDeclaredField(field.getName());
					privateField.setAccessible(true);
					if (privateField.get(clazz.cast(obj)) != null) {

						return (String) field.getType()
								.cast(privateField.get(clazz.cast(obj)))
								.toString();
					}
				}
			}
		}
		return null;
	}

	/**
	 * Retorna uma lista com a hierarquia de classes, sem considerar a classe Object.class
	 *
	 * @param Class&lt;?&gt; clazz
	 *            
	 * @return  List&lt;Class&gt;&lt;?&gt;&gt; clazz
	 */
	public List&lt;Class&gt;&lt;?&gt;&gt; getHierarquiaDeClasses(Class&lt;?&gt; clazz) {

		List&lt;Class&gt;&lt;?&gt;&gt; hierarquiaDeClasses = new ArrayList&lt;Class&gt;&lt;?&gt;&gt;();
		Class&lt;?&gt; classeNaHierarquia = clazz;
		while(classeNaHierarquia != Object.class) {
			hierarquiaDeClasses.add(classeNaHierarquia);
			classeNaHierarquia = classeNaHierarquia.getSuperclass();
			
		}
		return hierarquiaDeClasses;
	} 
}

Pessoal, ninguém passou por isso ainda não ? :frowning:

Por favor alguém me ajuda. rs
Prometo que é a última vez que respondo pra dar UP no tópico.

Obrigado

Estou com preguiça de ler este código. Mas para atualizar a selectOneMenu voce deveria mandar um comando “update” à partir de outro componente ao ID da selectOneMenu e recarregar a lista de SelectItem passada como parametro à mesma.

Update no selectOneMenu eu já faço, alem de atualizar tb o form que o contém.

O que posso tentar fazer é criar um metodo carregaMenu() no Bean e pedir pra ele instanciar minha lista novamente, vou fazer isso e posto o resultado.