2011-12-21 83 views
0

我仍然试图用jsf2,ejb3.1,cdi和glassfish编写应用程序。 我有有一个selectOneMenu用于由h:selectOneMenu/f:selectItems返回的值对于一个bean始终为空

<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的值总是空的形式。

我的FormBean

@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,我的应用程序从来没有调用过这个方法。

最后,我想提出一个整数(如我的bean的ID)和值吃得饱饱的,当我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> 

和实施您bean中的selectProducerValueChange ...