Значение, возвращаемое h: selectOneMenu / f: selectItems, всегда является нулем для bean-компонента - PullRequest
0 голосов
/ 21 декабря 2011

Я все еще пытаюсь запрограммировать приложение с помощью 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, и мое приложение никогда не вызывало этот метод.

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

Итак, ... что не так?

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

1 Ответ

0 голосов
/ 22 декабря 2011

вот как вы должны правильно использовать переменную 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 в вашем бине ...

...