Hello everyone. I am creating a system that controls user registration and I am having a problem with a foreign key that is imported from another class into the Users class. When I change the state's combobox, a COULD NOT EXTRACT RESULTSET error occurs.
NOTE: my combobox to select State is in relation to the combobox to choose the city. That is, when the value in the state combobox is changed, the values available in the city combobox are changed. They are in dependency.
In the xhtml file, in the part of the code that defines the state's combobox, there is an annotation value="# {RegisteredUserBean.user.user.status}". If I take the ".user", the program stops giving this error, but at the time of saving, it does not save the state. The rest of the information, including the city, it saves normal. If you observe, all other fields use ".user" in value. I do not know why only the State field is giving this problem.
User Registration.xhtml
<ui:define name="titulo">#{cadastroUsuarioBean.editando ? "Editar Cadastro de Usuário" : "Novo Usuário"}</ui:define>
<ui:define name="corpo">
<f:metadata>
<o:viewParam name="usuario" value="#{cadastroUsuarioBean.usuario}"/>
<f:event listener="#{cadastroUsuarioBean.inicializar}" type="preRenderView"/>
</f:metadata>
<h:form>
<h1>#{cadastroUsuarioBean.editando ? "Editar Cadastro de Usuário" : "Novo Usuário"}</h1>
<p:messages autoUpdate="true" closable="true"/>
<p:toolbar style="margin-top: 20px">
<p:toolbarGroup>
<p:button value="Novo" outcome="/usuario/CadastroUsuario" disabled ="#{cadastroUsuarioBean.editando}"/>
<p:commandButton value="Salvar" id="botaoSalvar" action="#{cadastroUsuarioBean.salvar}" update="@form" />
</p:toolbarGroup>
<p:toolbarGroup align ="right">
<p:button value="Pesquisar" outcome="/usuario/PesquisaUsuario"/>
</p:toolbarGroup>
</p:toolbar>
<p:panelGrid columns="2" id="painel" style="width: 100%; margin-top: 20px"
columnClasses="rotulo, campo">
<p:outputLabel value="Nome" for="nome"/>
<p:inputText id="nome" size="60" maxlength="60"
value="#{cadastroUsuarioBean.usuario.nome}" required="true" requiredMessage="Por favor, informe seu nome" validatorMessage="formato de nome inválido">
<f:validateRegex pattern="^[A-Za-záàâãéèêíïóôõöúçñÁÀÂÃÉÈÍÏÓÔÕÖÚÇÑ ]+$"/>
</p:inputText>
<p:outputLabel value="Senha" for="senha"/>
<p:password id="senha" size ="10" maxlength="6" required="true" requiredMessage="Por favor, informe uma senha" value="#{cadastroUsuarioBean.usuario.senha}" match="senha2" validatorMessage="As senhas informadas não coincidem. Por favor, informe-as novamente"/>
<p:outputLabel value="Verifique sua senha" for="senha"/>
<p:password id="senha2" size ="10" maxlength="6" required="true" requiredMessage="Confirme sua senha" value="#{cadastroUsuarioBean.usuario.senha}" match="senha2"/>
<p:outputLabel value="RG" for="rg"/>
<p:inputText id="rg" size="20" maxlength="20"
value="#{cadastroUsuarioBean.usuario.rg}" required="true" requiredMessage="por favor, preencha o número do seu RG"/>
<p:outputLabel value="CPF" for="cpf"/>
<p:inputMask id="cpf" size="14" maxlength="14"
value="#{cadastroUsuarioBean.usuario.cpf}" mask="999.999.999-99" required="true" requiredMessage="Por favor, informe seu CPF"/>
<p:outputLabel value="Email" for="email"/>
<p:inputText id="email" size="50" maxlength="50"
value="#{cadastroUsuarioBean.usuario.email}" required="true" requiredMessage="Por favor, informe um email para contato" validatorMessage="formato de email inválido">
<f:validateRegex
pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" />
</p:inputText>
<p:outputLabel value="Telefone para contato" for="telefone"/>
<p:inputMask id="telefone" size="14" maxlength="14"
value="#{cadastroUsuarioBean.usuario.telefone}" mask="(99)9999-9999" required="true" requiredMessage="Por favor, informe um telefone para contato"/>
<p:outputLabel value="Celular para contato" for="celular"/>
<p:inputMask id="celular" size="14" maxlength="14"
value="#{cadastroUsuarioBean.usuario.celular}" mask="(99)999999999" required="true" requiredMessage="Por favor, informe um celular para contato"/>
<p:outputLabel value="Estado" for="estado"/>
<p:selectOneMenu id="estado" value="#{cadastroUsuarioBean.usuario.estado}" label="Estado" filter="true"
filterMatchMode="contains" required="true" requiredMessage="Por favor, escolha um estado">
<f:selectItem itemLabel="Estado" noSelectionOption = "true"/>
<f:selectItems
value="#{cadastroUsuarioBean.listEstados}" var="estado"
itemValue="#{estado}" itemLabel="#{estado.estado_sigla}" />
<p:ajax listener="#{cadastroUsuarioBean.carregarCidades}" update="cidade"/>
</p:selectOneMenu>
<p:outputLabel value="Cidade" for="cidade"/>
<p:selectOneMenu id="cidade" value="#{cadastroUsuarioBean.usuario.cidade}">
<f:selectItem itemLabel="Selecione a cidade"/>
<f:selectItems value="#{cadastroUsuarioBean.listCidades}" var ="cidade"
itemValue="#{cidade}" itemLabel="#{cidade.cidadeNome}"/>
</p:selectOneMenu>
<p:outputLabel value="CEP" for="cep"/>
<p:inputMask id="cep" size="8" maxlength="8"
value="#{cadastroUsuarioBean.usuario.cep}" mask="99999-999" required="true" requiredMessage="Por favor, informe o CEP de seu endereço"/>
<p:outputLabel value="Endereço" for="endereco"/>
<p:inputText id="endereco" size="100" maxlength="100"
value="#{cadastroUsuarioBean.usuario.endereco}" required="true" requiredMessage="Por favor, informe um endereço de correspondência"/>
</p:panelGrid>
</h:form>
</ui:define>
User RegistrationBean.java
@Named
@ViewScoped
public class CadastroUsuarioBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EstadosRep estadosRep;
@Inject
private CidadeRep cidadeRep;
@Inject
private CadastroUsuarioService cadastroUsuarioService;
private Usuario usuario;
private Estado categoriaPai;
private Estado estado;
private Cidade cidade;
private String email;
private List<SelectItem> listEstados;
private List<SelectItem> listCidades;
public CadastroUsuarioBean() {
limpar();
}
public boolean isEditando() {
boolean resultado = false;
if (this.usuario != null) {
resultado = usuario.getId() != null;
}
return resultado;
}
public void inicializar() {
listEstados = new ArrayList<SelectItem>();
List<Estado> estados = estadosRep.raizes();
for (Estado e : estados) {
SelectItem item = new SelectItem();
item.setLabel(e.getEstado_sigla());
item.setValue(e);
listEstados.add(item);
}
if(!isEditando()){
usuario.setStatus("Ativo");
}
if (this.estado != null) {
estados = estadosRep.raizes();
}
}
public void limpar() {
usuario = new Usuario();
listEstados = new ArrayList<SelectItem>();
}
public void salvar() {
this.usuario = cadastroUsuarioService.salvar(this.usuario);
limpar();
FacesUtil.addInfoMessage("Cadastro de usuário efetuado com sucesso!");
}
public void carregarCidades(){
listCidades = new ArrayList<SelectItem>();
List<Cidade> cidades = cidadeRep.cidadesDe(estado);
for (Cidade c : cidades) {
SelectItem item = new SelectItem();
item.setLabel(c.getCidadeNome());
item.setValue(c);
listCidades.add(item);
}
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public Estado getEstado() {
return estado;
}
public void setEstado(Estado estado) {
this.estado = estado;
}
public List<SelectItem> getListEstados() {
return listEstados;
}
public void setListEstados(List<SelectItem> listEstados) {
this.listEstados = listEstados;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String register() {
return "thanks?faces-redirect=true";
}
public Estado getCategoriaPai() {
return categoriaPai;
}
public void setCategoriaPai(Estado categoriaPai) {
this.categoriaPai = categoriaPai;
}
public Cidade getCidade() {
return cidade;
}
public void setCidade(Cidade cidade) {
this.cidade = cidade;
}
public List<SelectItem> getListCidades() {
return listCidades;
}
public void setListCidades(List<SelectItem> listCidades) {
this.listCidades = listCidades;
}
}
Cidade.java
@Entity
@Table(name = "cidade")
public class Cidade {
private static final long serialVersionUID = 1L;
private String cidadeNome;
private Estado estado;
@Id
@Column(nullable = false, length = 60)
public String getCidadeNome() {
return cidadeNome;
}
public void setCidadeNome(String cidadeNome) {
this.cidadeNome = cidadeNome;
}
@ManyToOne
@JoinColumn(name = "estado_sigla")
public Estado getEstado() {
return estado;
}
public void setEstado(Estado estado) {
this.estado = estado;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cidadeNome == null) ? 0 : cidadeNome.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cidade other = (Cidade) obj;
if (cidadeNome == null) {
if (other.cidadeNome != null)
return false;
} else if (!cidadeNome.equals(other.cidadeNome))
return false;
return true;
}
}
CidadeRep.java
public class CidadeRep implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager manager;
public Cidade porNomeCidade(String cidadeNome){
return manager.find(Cidade.class, cidadeNome);
}
public List<Cidade> raizes(){
return manager.createQuery("from Cidade", Cidade.class).getResultList();
}
public List<Cidade> cidadesDe(Estado estado){
return manager.createQuery("from Cidade where estado_sigla = :raiz", Cidade.class)
.setParameter("raiz", estado).getResultList();
}
}
State.java
@Entity
@Table(name = "estado")
public class Estado implements Serializable {
private static final long serialVersionUID = 1L;
private String estado_sigla;
private String estado_nome;
@Id
@Column(nullable = false, length = 2)
public String getEstado_sigla(){
return estado_sigla;
}
public void setEstado_sigla(String estado_sigla){
this.estado_sigla = estado_sigla;
}
@NotNull
@Column(nullable = false, length = 50)
public String getEstado_nome(){
return estado_nome;
}
public void setEstado_nome(String estado_nome){
this.estado_nome = estado_nome;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((estado_sigla == null) ? 0 : estado_sigla.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Estado other = (Estado) obj;
if (estado_sigla == null) {
if (other.estado_sigla != null)
return false;
} else if (!estado_sigla.equals(other.estado_sigla))
return false;
return true;
}
}
EstadoRep.java
public class EstadosRep implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager manager;
public Estado porSigla(String estado_sigla) {
return manager.find(Estado.class, estado_sigla);
}
public List<Estado> raizes(){
return manager.createQuery("from Estado",Estado.class).getResultList();
}
public List<Estado> listarEstado() {
List<Estado> estados = new ArrayList<Estado>();
estados = manager.createQuery("from Estado", Estado.class).getResultList();
return estados;
}
}
ConverterUsername
@FacesConverter(forClass = Estado.class)
public class ConverterUsuarioEstado implements Converter {
//@Inject
private EstadosRep estadosRep;
public ConverterUsuarioEstado() {
estadosRep = CDIServiceLocator.getBean(EstadosRep.class);
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Estado retorno = null;
System.out.println("getasobject : "+value);
if (value != null) {
String estado_sigla = new String(value);
retorno = estadosRep.porSigla(estado_sigla);
}
return retorno;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null || value.equals("")) {
return "";
} else {
String estado_sigla = ((Estado)value).getEstado_sigla();
return String.valueOf(estado_sigla);
}
}
}
User.java
@Entity
@SequenceGenerator(name ="usuario_sequence", sequenceName = "usuario_sequence")
@Table(name = "usuario")
public class Usuario implements Serializable{
private static final long serialVersionUID = 1L;
private Long id;
private String nome;
private String senha;
private String status;
private String cpf;
private String rg;
private String email;
private String telefone;
private String celular;
private String endereco;
private Estado estado;
private Cidade cidade;
private String cep;
private List<Grupo> grupos = new ArrayList<>();
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "usuario_sequence")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@NotNull
@Column(nullable = false, length = 60)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@NotNull
@Column(nullable = false, length = 6)
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
@NotNull
@Column(nullable = false, length = 14, unique=true)
public String getCpf(){
return cpf;
}
public void setCpf(String cpf){
this.cpf = cpf;
}
@NotNull
@Column(nullable = false, length = 20)
public String getRg(){
return rg;
}
public void setRg(String rg){
this.rg = rg;
}
@NotNull
@Column(nullable = false, length = 50)
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email = email;
}
@NotNull
@Column(nullable = false, length = 14)
public String getTelefone(){
return telefone;
}
public void setTelefone(String telefone){
this.telefone = telefone;
}
@NotNull
@Column(nullable = false, length = 14)
public String getCelular() {
return celular;
}
public void setCelular(String celular) {
this.celular = celular;
}
@NotNull
@Column(nullable = false, length = 200)
public String getEndereco(){
return endereco;
}
public void setEndereco(String endereco){
this.endereco = endereco;
}
@NotNull
@Column(nullable = false, length = 9)
public String getCep(){
return cep;
}
public void setCep(String cep){
this.cep = cep;
}
@ManyToOne
@JoinColumn(name = "estado_sigla")
public Estado getEstado(){
return estado;
}
public void setEstado(Estado estado){
this.estado = estado;
}
@ManyToOne
@JoinColumn(name = "cidadeNome")
public Cidade getCidade() {
return cidade;
}
public void setCidade(Cidade cidade) {
this.cidade = cidade;
}
@NotNull
@Column(nullable = false, length = 7)
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Usuario other = (Usuario) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "usuario_grupo", joinColumns = @JoinColumn(name="usuario_id"),
inverseJoinColumns = @JoinColumn(name = "grupo_id"))
public List<Grupo> getGrupos() {
return grupos;
}
public void setGrupos(List<Grupo> grupos) {
this.grupos = grupos;
}
}
Thanks in advance for any suggestions or opinions.