Por que selectOneMenu Enviar ItemLabel para o conversor?

minha página JSF


  

class do conversor (StudentConverter)


 public Object getAsObject(FacesContext context, UIComponent component, String value) { Student studConvert= new Student(); List students=new ArrayList(); students=(ArrayList)((UISelectItems component.getChildren().get(0)).getValue(); } 

neste conversor o Argument ‘String value’ dá ao itemLabel i porque acontece ?? eu vario o itemValue nesta string

Não sei por que você recebeu o label do item em vez do valor do item dentro de getAsObject() . Talvez seu getAsString() esteja fazendo errado e esteja retornando o nome do aluno com base no ID do aluno.

De qualquer forma, posso dizer que o seu itemValue definitivamente não está certo.

     

Um conversor é usado para converter entre um object Java complexo e uma representação de String para que possa ser passado como um parâmetro de solicitação HTTP. No entanto, você está especificando o ID do aluno como valor do item em vez de todo o object do aluno. Você precisa especificar o object inteiro do aluno. Você também deve garantir que #{studBean.selectedStudent} se refira a uma propriedade Student e não a uma propriedade Long represente o ID do aluno.

Quando você corrigir o itemValue seguinte maneira:

     

e seu conversor da seguinte forma (nullchecks triviais omitidos):

 public String getAsString(FacesContext context, UIComponent component, Object value) { // This method is called when item value is to be converted to HTTP request parameter. // Normal practice is to return an unique identifier here, such as student ID. Student student = (Student) value; Long id = student.getStudid(); return String.valueOf(id); } public Object getAsObject(FacesContext context, UIComponent component, String value) { // This method is called when HTTP request parameter is to be converted to item value. // You need to convert the student ID back to Student. Long id = Long.valueOf(value); Student student = someStudentService.find(id); return student; } 

então deveria funcionar.

Alternativamente, você poderia manter seu itemValue como você tinha inicialmente e remover o completamente, mas então você tem que mudar #{studBean.selectedStudent} para apontar para uma propriedade Long representando o ID do aluno.

Você precisa usar a lista selectitem no atributo f:selecitems de h:selectOneMenu

Sua página será assim;

        

No lado do bean de apoio, você precisa preencher o item select de studentSelectItemList.

 private List studentSelectItemList; //fill studentSelectItemList at the appropriate place studentSelectItemList.add(new SelectItem(studentId,studentName)); 

Após essas configurações, você deve ter o ID do aluno como valor de seleção.

Hoje tive o mesmo problema.

É causado por essa renderização incorreta:

  

omitindo value="" para “None”, a opção resultará no envio do label em vez de uma string vazia .

No entanto, para resolver isso e tornar o renderizador write value="" para a primeira opção, certifique-se de que getAsString() nunca retorne null , retorne "" (string vazia).


@BalusC

  ...         ...          ...          

Seu omnifaces.ListIndexConverter para o resgate 🙂

BalusC (novamente) pregou este para mim. Eu tive o mesmo problema e como o BalusC apontou anteriormente, o método getAsString () do meu conversor retornava a propriedade “firstname” do meu object.

@Override public String getAsString (contexto FacesContext, componente UIComponent, valor do object) {

  if (value == null || value.equals("")) { return ""; } else { return String.valueOf(((Employee) value).getfirstname()); } } 

Eu mudei isso para retornar o id e ele começou a funcionar como esperado.

@Override public String getAsString (contexto FacesContext, componente UIComponent, valor do object) {

  if (value == null || value.equals("")) { return ""; } else { return String.valueOf(((Employee) value).getId()); } } 

BalusC seu esforço para explicar a teoria é muito apreciado. Você é celestial!

Intereting Posts