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 !!!
O código da view:
<h:selectOneMenu id="comboUsuario" value="#{professorBean.professor.usuario}"
style="width: 160px;">
<f:converter converterId="entityConverter" />
<f:selectItems value="#{usuarioBean.usuarios}" var="obj"
itemLabel="#{obj.login}" itemValue="#{obj}" />
</h:selectOneMenu>
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<Professor> professores;
private Professor professor = new Professor();
@PostConstruct
public void carregaProfessores() {
System.out.println("Carregando Professores...");
professores = new DAO<Professor>(Professor.class).listaTodos();
}
public String grava() {
DAO<Professor> dao = new DAO<Professor>(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<Professor> dao = new DAO<Professor>(Professor.class);
dao.remove(professor);
this.professores = dao.listaTodos();
this.professor = new Professor();
}
public List<Professor> getProfessores() {
return professores;
}
public void setProfessores(List<Professor> 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<Usuario> usuarios;
private Usuario usuario = new Usuario();
public String grava() {
DAO<Usuario> dao = new DAO<Usuario>(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<Usuario> dao = new DAO<Usuario>(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<Usuario>(Usuario.class).listaTodos();
}
public List<Usuario> 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 && !"".equals(obj)) {
String id;
try {
id = this.getId(getClazz(ctx, component), obj);
if (id == null) {
id = "";
}
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<?>
*/
private Class<?> getClazz(FacesContext facesContext, UIComponent component) {
return component.getValueExpression("value").getType(
facesContext.getELContext());
}
/**
* Retorna a representação em String do retorno do método anotado com @Id ou @EmbeddedId do objeto.
*
* @param Class<?> clazz
*
* @return String
*/
public String getId(Class<?> clazz, Object obj) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
List<Class><?>> hierarquiaDeClasses = this.getHierarquiaDeClasses(clazz);
for (Class<?> 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<?> clazz
*
* @return List<Class><?>> clazz
*/
public List<Class><?>> getHierarquiaDeClasses(Class<?> clazz) {
List<Class><?>> hierarquiaDeClasses = new ArrayList<Class><?>>();
Class<?> classeNaHierarquia = clazz;
while(classeNaHierarquia != Object.class) {
hierarquiaDeClasses.add(classeNaHierarquia);
classeNaHierarquia = classeNaHierarquia.getSuperclass();
}
return hierarquiaDeClasses;
}
}