【问题标题】:The value returned by a h:selectOneMenu / f:selectItems is always null for a beanh:selectOneMenu / f:selectItems 返回的值对于 bean 始终为 null
【发布时间】:2011-12-21 09:57:21
【问题描述】:

我仍在尝试使用 jsf2、ejb3.1、cdi 和 glassfish 编写应用程序。 我有一个带有 selectOneMenu 的表单

<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 组件的显示效果很好,但是当我提交表单时,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,但我的应用从未调用过此方法。

最后,我尝试提交一个整数(例如,我的 bean 的 id),提交时该值已填好。1

那么,……怎么了?

提前感谢您的帮助

【问题讨论】:

    标签: jsf-2 cdi selectonemenu


    【解决方案1】:

    这里是你应该如何在 jsf2 中正确使用 valuechangelistener

    &lt;f:ajax listener="#{bottleManagedBean.selectProducer}" /&gt; 添加到您的&lt;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...

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多