1

2 つの h:selectOneMenu (1: 国、2: 都市) があります。ajaxを使用して、selectOneMenuの都市で選択した1つの国からすべての都市をロードする必要があります。国 selectOneMenu の値を変更すると、私の都市 selectOneMenu は countryBean.selectedCountry から null 値を取得します。

<h:panelGrid columns="2">
    <h:outputLabel for="countries" value="Countries: " />
    <h:selectOneMenu converter="omnifaces.SelectItemsConverter"
        id="countries" required="true" value="#{countryBean.selectedCountry}">
        <f:selectItem itemLabel="Choose country" />
        <f:selectItems value="#{countriesBB.findAllCountries()}"
            var="country" itemLabel="#{country.name}" />
        <f:ajax event="change" render="cities" />
    </h:selectOneMenu>

    <h:outputLabel for="cities"
        value="Cities: " />
    <h:selectOneMenu converter="omnifaces.SelectItemsConverter"
        id="cities" required="true"
        value="#{cityBean.selectedCity}">
        <f:selectItem itemLabel="Choose city" />
        <f:selectItems value="#{cityBean.findAllCitiesByCountry(countryBean.selectedCountry)}"
            var="city" itemLabel="#{city.name}" />
    </h:selectOneMenu>
</h:panelGrid>

これは、都市を見つける方法です。

public List<city> findAllCitiesByCountry(Country country) {

        List<City> cities = null;
        try {

            cities = citiesService.findAllCitiesByCountry(country);

        } catch (Exception exception) {
            logger.debug("Error finding cities.", exception);
        }

        return cities;

    }

countryBean.selectedCountry は常に null であるため、NullPointerException が発生しています。これを行う正しい方法は何ですか?

4

1 に答える 1

2

JSF スターターが知っておく必要がある多くのルールの 1 つ:

  • getter メソッドでビジネス ロジックを実行しないでください。

ゲッターメソッドを真のゲッターメソッドに保ち(つまり、 以外は何もしないreturn property;)、(ポスト)コンストラクターおよび/またはアクション(リスナー)メソッドでビジネスロジックを実行することで修正しようとすると、この特定の問題は消えます。

キックオフの例を次に示します。

<h:selectOneMenu value="#{bean.country}">
    <f:selectItems value="#{bean.countries}" ... />
    <f:ajax listener="#{bean.changeCountry}" render="cities" />
</h:selectOneMenu>
<h:selectOneMenu id="cities" value="#{bean.city}">
    <f:selectItems value="#{bean.cities}" ... />
</h:selectOneMenu>

@ViewScopedBeanで次のようなものを使用します。

private Country country; // +getter+setter
private City city; // +getter+setter
private List<Countries> countries; // +getter
private List<Cities> cities; // +getter

@EJB
private SomeService service;

@PostConstruct
public void init() {
    countries = service.getCountries();
}

public void changeCountry() {
    cities = service.getCities(country);
}
于 2013-08-28T22:54:14.560 に答える