2011-12-21 3 views
0

Я все еще пытаюсь запрограммировать приложение с помощью jsf2, ejb3.1, cdi и glassfish. У меня есть форма, которые имеют selectOneMenuЗначение, возвращаемое функцией h: selectOneMenu/f: selectItems всегда равно null для компонента

<h:form prependId="false"> 
... 
<f:validateBean> 
... 
<h:selectOneMenu value="#{bottleManagedBean.selectProducer}" id="selectproducerb" 
              validatorMessage="#{messages.bottleaddinvalideproducer}" immediate="true"> 
           <f:converter binding="#{producerConverter}"/> 
           <f:selectItems value="#{bottleManagedBean.producerItems}" /> 
          </h:selectOneMenu> 
... 

компонента selectItems хорошо showned, но когда я отправить форму значение bottleManagedBean.selectProducer всегда нуль.

Мой компонент формы

@Named("bottleManagedBean") 
@RequestScoped 
public class BottleManagedBean { 
.... 

private List<Producer> producers; 

    public List<Producer> getProducers() { 
     if (producers == null) { 
      setProducers(producerService.list(Producer.class)); 
     } 
     return producers; 
    } 

    public void setProducers(List<Producer> producers) { 
     this.producers = producers; 
    } 

    private Producer selectProducer; 

    public Producer getSelectProducer() { 
     return selectProducer; 
    } 

    private List<SelectItem> producerItems; 

    public List<SelectItem> getProducerItems() { 
     if (producerItems == null) { 
      producerItems = new ArrayList<SelectItem>(); 
      for (Producer current : getProducers()) { 
       producerItems.add(new SelectItem(current.getId(), current.getName())); 
      } 
     } 
     return producerItems; 
    } 

    public void setProducerItems(List<SelectItem> producerItems) { 
     this.producerItems = producerItems; 
    } 
... 

Преобразователь

@Named("producerConverter") 
public class ProducerConverter implements Converter { 

    @Inject 
    BusinessService<Producer> service; 

    private static Logger trace = Logger.getLogger(ProducerConverter.class.getCanonicalName()); 

    @Override 
    public Object getAsObject(FacesContext fc, UIComponent uic, String id) { 
     try { 
      return service.findByID(Producer.class, Integer.parseInt(id)); 
     } catch (NumberFormatException e) { 
      e.printStackTrace(); 
      throw new ConverterException(e); 
     } 
    } 

    @Override 
    public String getAsString(FacesContext fc, UIComponent uic, Object o) { 
     String asString = null; 
     if (o != null) { 
      asString = String.valueOf(o); 
     } 
     return asString; 
    } 
} 

Я пытался отладить приложение .Когда я отправить форму, приложение никогда не переходит в инкубаторе.

Я также попытался добавить valuechangelistener, и мое приложение никогда не вызывало этот метод.

Наконец, я попытался представить целое число (например, идентификатор моего боба) и значение хорошо заполнены, когда я submit.1

Итак ... что случилось?

Заранее спасибо за вашу помощь

ответ

0

вот как вы должны использовать valuechangelistener должным образом в jsf2

Добавить <f:ajax listener="#{bottleManagedBean.selectProducer}" /> в свой <h:selectOneMenu

Как это:

<h:selectOneMenu value="#{bottleManagedBean.selectProducerValueChange}" id="selectproducerb" 
             validatorMessage="#{messages.bottleaddinvalideproducer}"> 
          <f:ajax listener="#{bottleManagedBean.selectProducerValueChange}" /> 
          <f:converter binding="#{producerConverter}"/> 
          <f:selectItems value="#{bottleManagedBean.producerItems}" /> 
         </h:selectOneMenu> 

и осуществлять selectProducerValueChange в вашем компоненте ...

 Смежные вопросы

  • Нет связанных вопросов^_^