Value selected by selectOneMenu comes null

Asked

Viewed 154 times

0

I have a selectOneMenu that contains a list of document types, which I associate to the documents being attached in a p:fileUpload, however, the value selected by selectOneMenu comes null

View of File Attachment

<p:dialog id="dialogAnexos" minHeight="70" header="Anexar Arquivos"
                              widgetVar="dialogAnexos">
                        <h:outputLabel value="Tipo de Documento *:" style="font-weight: bold" />


                        <h:selectOneMenu style="height: 20px; width: 200px; background-color: #fff;"
                                         value="#{registroOnlineEmpresaController.tipoDocumentoSelecionado}"
                                         required="true" requiredMessage="Tipo de Documento: Selecione uma Opção...">

                            <f:selectItem noSelectionOption="true" itemLabel="Selecione..." />

                            <f:selectItems value="#{registroOnlineEmpresaController.obterTiposDocumentos()}" />

                        </h:selectOneMenu>

                        <br />
                        <br />

                        <h:outputLabel value="Anexo de Arquivos *:" style="font-weight: bold" />

                        <br />
                        <br />

                        <p:fileUpload id="uploadAnexo"
                              fileUploadListener="#{registroOnlineEmpresaController.handleFileUpload}"
                              allowTypes="/(\.|\/)(gif|png|jpe?g|pdf)$/"
                              sizeLimit="10000000"
                              label="Escolher..."
                              multiple="true"
                              auto="true"
                              showButtons="false"
                              mode="advanced"
                              uploadLabel="Enviar Arquivos"
                              process="@this"
                              dragDropSupport="true"
                              required="true"
                              requiredMessage="Anexe pelo menos um arquivo"/>

                        <p:commandButton value="Enviar" onclick="dialogAnexos.hide();" immediate="true"/>
                    </p:dialog>

Method filling in the Document Types List

public Map<String, Object> obterTiposDocumentos() {
   Map<String, Object> tiposDocumentos = new HashMap();

   tiposDocumentos.put("CNPJ", "CNPJ");
   tiposDocumentos.put("Contrato", "Contrato");

   return tiposDocumentos;
  }

Handlefileupload, where the document type is associated with the attached file

public void handleFileUpload(FileUploadEvent event) throws IOException {
   UploadedFile item = event.getFile();

   Calendar c = Calendar.getInstance();
   int mes = c.get(Calendar.MONTH);
   mes++;
   String complementoDir = c.get(Calendar.YEAR) + "/" + mes + "/" + c.get(Calendar.DAY_OF_MONTH) + "/";
   String sDiretorio = SistemaConstante.CAMINHO_ARQUIVOS_REGISTRO_ON_LINE_EMPRESA + complementoDir;
   String sCaminho = SistemaConstante.DIRETORIO_ARQUIVOS_REGISTRO_ON_LINE_EMPRESA + complementoDir;
   String nomeArquivo = item.getFileName().replace("\\", File.separator).replaceAll(" ", "_");

   File diretorio = new File(sDiretorio);

   boolean diretorioCriado = true;

   if (!diretorio.exists()) {
       if (!diretorio.mkdir()) {
           if (!diretorio.mkdirs()) {
               FacesUtils.mensFatal("Falha na criação do diretório!");
               diretorioCriado = false;
           }
       }
  }

  if(diretorioCriado) {
      String aux = StringUtil.removerAcentos(nomeArquivo);
      String caminhoArquivo = sDiretorio + aux;
      String caminhoVerArquivo = sCaminho + aux;
      File arquivo = new File(caminhoArquivo);

      OutputStream out = new FileOutputStream(arquivo);
      out.write(item.getContents());
      out.close();

      arquivoRegistroOnlineEmpresa = new ArquivoRegistroOnlineEmpresa();
      arquivoRegistroOnlineEmpresa.setCaminhoArquivo(caminhoArquivo);
      arquivoRegistroOnlineEmpresa.setCaminhoVerArquivo(caminhoVerArquivo);
      arquivoRegistroOnlineEmpresa.setTipoDocumento(tipoDocumentoSelecionado);
      arquivoRegistroOnlineEmpresaDao.salvar(arquivoRegistroOnlineEmpresa);
      arquivoRegistroOnlineEmpresa.setNomeArquivo(aux);
      arquivosRegistroOnlineEmpresa.add(arquivoRegistroOnlineEmpresa);
  }
  }

2 answers

1

I believe the problem is at the moment you are evaluating the variable.

The method handleFileUpload is called immediately after uploading the file and at this time as its entire form has not been submitted the value of the tipoDocumentoSelecionado is void.

I believe that the simplest solution in your case is to get the value of the selected document type sent with each change, you can do this by adding an ajax event to the onChange of selectOneMenu.

I would also suggest that you use the selectOneMenu of the primefaces.

<p:selectOneMenu value="#{registroOnlineEmpresaController.tipoDocumentoSelecionado}" required="true" requiredMessage="Tipo de Documento: Selecione uma Opção...">
    <f:selectItem noSelectionOption="true" itemLabel="Selecione..." />
    <f:selectItems value="#{registroOnlineEmpresaController.obterTiposDocumentos()}" />

    <p:ajax event="change" />

</p:selectOneMenu>

I would also suggest that you put one <h:form> involving your selectOneMenu and fileupload.

0


I managed to solve, I made some modifications in the converter and it worked

@FacesConverter(value = "tipoDocumentoConverter")
public class TipoDocumentoConverter implements javax.faces.convert.Converter {

     public TipoDocumentoConverter() {
     }

     @Override
     public Object getAsObject(FacesContext facesContext, UIComponent component, String string) {
     if (string == null) {
          return null;
     }

         Long id = Long.parseLong(string);
         TipoDocumento tipoDocumento = new TipoDocumento();
         // tipoDocumento.setDescricao(string);
         tipoDocumento.setIdTipoDocumento(id);
         return tipoDocumento;
     }

     @Override
     public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object object) {
         if (object == null) {
             return null;
         }

         if (object instanceof TipoDocumento) {
             TipoDocumento t = (TipoDocumento) object;
             // return "" + t.getDescricao();
             return "" + t.getIdTipoDocumento();
         } else {
             throw new IllegalArgumentException("object:" + object + "of type:"
            + object.getClass().getName() + "; expected type:br.org.creapi.entities.TipoDocumento");
        }

   }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.