2015-09-28 3 views
0

После моего сообщения (Hibernate Primefaces AutoComplete text) Я немного переключил реализацию. Но теперь я столкнулся с проблемой.OneMenu не сохраняет измененное значение

Даже если я использую событие AJAX, я не сохраняю сохраненное выбранное значение, чтобы заполнить второй снимок.

мой Create.xhtml

<h:head></h:head> 
<ui:debug rendered="true"/> 
    <body> 
     <h:form id="createAddressForm" prependId="true"> 
      <!-- <p:messages autoUpdate="true" /> --> 
      <p:growl id="msgs" showDetail="true" /> 

      <h:panelGrid columns="2" style="margin-bottom:10px" cellpadding="5"> 
       <p:outputLabel for="countryDropDown" value="Country" /> 
       <p:selectOneMenu id="countryDropDown" value="#{addressController.selectedIsoCountry}" > 
        <p:ajax listener="#{addressController.onCountryChange}" update="stateDropDown" /> 
        <f:selectItem itemValue="" itemLabel="Select a country"/> 
        <f:selectItems value="#{addressController.countryMap}" /> 
       </p:selectOneMenu> 

       <p:outputLabel for="stateDropDown" value="State" /> 
       <p:selectOneMenu id="stateDropDown" value="#{addressController.state}" > 
        <f:selectItem itemValue="" itemLabel="Selecione a State" /> 
        <f:selectItems value="#{addressController.stateMap}" /> 
       </p:selectOneMenu>    
      </h:panelGrid> 
     </h:form> 
    </body> 
</html> 

И это AddressController.java

import java.util.Map; 
import java.util.TreeMap; 

import javax.annotation.PostConstruct; 
import javax.ejb.EJB; 
import javax.faces.bean.SessionScoped; 
import javax.inject.Named; 

import br.com.azulseguros.ejb.CountryEJB; 
import br.com.azulseguros.entity.Country; 
import br.com.azulseguros.entity.State; 

@SessionScoped 
@Named 
public class AddressController { 
    @EJB 
    private CountryEJB countryEJB; 

    private String selectedIsoCountry = null; 

    private State state = null; 

    private Map<String, String> countryMap = null; 

    private Map<String, String> stateMap = null; 

    @PostConstruct 
    private void init() { 
     Map<String, String> retorno = new TreeMap<String, String>(); 
     for (Country _tmp : countryEJB.findAll()) { 
      retorno.put(_tmp.getName(), _tmp.getIso()); 
     } 
     countryMap = retorno; 
    } 

    public Map<String, String> getCountryMap() { 
     return countryMap; 
    } 

    public Map<String, String> getStateMap() { 
     return stateMap; 
    } 

    public String getSelectedIsoCountry() { 
     return selectedIsoCountry; 
    } 

    public State getState() { 
     return state; 
    } 

    public void setSelectedIsoCountry(String selectedIsoCountry) { 
     this.selectedIsoCountry = selectedIsoCountry; 
    } 

    public void setState(State state) { 
     this.state = state; 
    } 

    public void setCountryMap(Map<String, String> countryMap) { 
     this.countryMap = countryMap; 
    } 

    public void setStateMap(Map<String, String> stateMap) { 
     this.stateMap = stateMap; 
    } 

    public void onCountryChange() { 
     setStateMap(getStatesFromSelectedCountry()); 
    } 

    private Map<String, String> getStatesFromSelectedCountry() { 
     Map<String, String> retorno = new TreeMap<String, String>(); 
     if (selectedIsoCountry != null && !selectedIsoCountry.equals("")) { 
      for (State _tmp : countryEJB.findByIso(selectedIsoCountry).getStates()) { 
       retorno.put(_tmp.getName(), _tmp.getFu()); 
      } 
     } 
     return retorno; 
    } 
} 

EJB-responsibile для нахождения всех стран и государств работает нормально. С этим связано много проблем, и я не знаю, что делать, чтобы исправить это. 1 - После того, как я вызываю страницу в первый раз, она вызывает метод init 10 раз; 2 - После этого он вызвал метод getStatesFromSelectedCountry, даже не выбирая ни одну страну из 1-го падения, а затем снова вызывает метод init; 3 - Когда я выбираю страну, она вызывает 7 раз метод init, а затем getStatesFromSelectedCountry(), но выбранная IsoCountry имеет значение NULL.

ответ

1

init метод бин вызывается много раз, потому что вы определили боб и как КДИ боб с использованием javax.inject.Named, без рамки, а также JSF Managed Bean с использованием javax.faces.bean.SessionScoped; если вы собираетесь использовать CDI-компоненты, просто замените последнюю аннотацию на javax.enterprise.context.SessionScoped. См. Why are there different bean management annotations

С точки зрения CDI, компонент по умолчанию RequestScoped, это должно объяснить также вторую проблему, с которой вы столкнулись.

Что касается третьего вопроса см это Q/A:

  1. Why is the getter called so many times by the rendered attribute?
  2. Why JSF calls getters multiple times
+1

Просто аннотирования класс с 'javax.faces.bean.SessionScoped' не делает его jsf управляемый bean-компонент. Для этого требуется либо аннотация '@ ManagedBean', либо объявление в' faces-config.xml'. – Kukeltje

+0

Хорошая точка @ Kukeltje, но в любом случае это должно быть причиной проблемы, вы не согласны? – perissf

+1

Да, это должно быть причиной, добавлена ​​ссылка на более подробное объяснение. Пометить это как дубликат, это нехорошо, но я уверен, что ** ** ** дубликат – Kukeltje

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