JSF 2.0 Ajax слушатель в тэге SelectOneMenu не работает - PullRequest
2 голосов
/ 25 августа 2011

ПРОБЛЕМА РЕШЕНА !! Произошла ошибка проверки на моем компоненте поддержки, говорящая мне что-то вроде этого: Значение параметра Ошибка преобразования «Африка (AFR)» для «нулевого преобразователя».

Из-за жизненного цикла JSF метод прослушивания на моем бэкане не назывался


У меня проблема с JSF2.У меня есть тег selectOneMenu с тегом ajax, который должен запускать слушателя при изменении его значения.Страница xhtml выглядит следующим образом (некоторые элементы удалены)

<h:selectOneMenu id="selectedContinent" value="#{searchExtendedAction.destination.continent}">
            <f:selectItems value="#{searchExtendedAction.continents}" />
            <f:ajax render="locationSelector" listener="#{searchExtendedAction.doUpdateLocations}" />
</h:selectOneMenu>

В моем компоненте поддержки есть следующее (некоторые свойства не указаны):

@ManagedBean
@SessionScoped
public class SearchExtendedAction implements Serializable{


// Left some properties out


    @Valid
    private Location departure;

    @PostConstruct
    public void init(){
        System.err.println("INIT called");
        allContinents = continentService.getAllContinents();
    }

    @EJB
    private ContinentService continentService;

    public void doExtendedSearch()
    {
        System.err.println("SEARCH");
    }
    public void doUpdateLocations(AjaxBehaviorEvent event)
    {
        System.err.println("BONZAI");
    }

    public List<SelectItem> getContinents()
    {
        List<SelectItem> continents= new ArrayList<SelectItem>();
        continents.add(new SelectItem("--- Select Continent ---"));

        for(Continent c : continentService.getAllContinents()){
            continents.add(new SelectItem(c.getName()));
        }

        return continents;
    }
}

Теперь, когда я выбираюзначение из моего selectOneMenu HTTP-сообщение запускается.И я знаю это, потому что мой метод PostConstruct вызывается, и сообщение выскакивает в моей консоли.Но слушатель не называется.И я понятия не имею, почему.

Еще немного информации о технологиях, которые я использую:

16:21:08,282 INFO  [AbstractServer] Starting: JBossAS [6.1.0.Final "Neo"]
16:21:11,725 INFO  [ServerInfo] Java version: 1.7.0,Oracle Corporation
16:21:11,725 INFO  [ServerInfo] Java Runtime: Java(TM) SE Runtime Environment (build 1.7.0-b147)
16:21:11,725 INFO  [ServerInfo] Java VM: Java HotSpot(TM) 64-Bit Server VM 21.0-b17,Oracle Corporation
16:21:11,726 INFO  [ServerInfo] OS-System: Windows 7 6.1,amd64
16:21:19,067 INFO  [AbstractServerConfig] JBoss Web Services - Stack CXF Server 3.4.1.GA
16:21:19,981 INFO  [JSFImplManagementDeployer] Initialized 3 JSF configurations: [Mojarra-1.2, MyFaces-2.0, Mojarra-2.0]

1 Ответ

2 голосов
/ 25 августа 2011

Теперь, когда я выбираю значение из моего selectOneMenu, отправляется сообщение HTTP. И я знаю это, потому что мой метод PostConstruct вызывается, и сообщение появляется в моей консоли.

Это не нормально, что @PostConstruct сессионного bean-объекта запускается в этот момент. Он должен запускаться только один раз во время создания компонента, когда вы запрашиваете представление в первый раз в сеансе. Вы уверены, что @SessionScoped имеет тип javax.faces.bean.SessionScoped и, следовательно, не javax.enterprise.context.SessionScoped?

Обновление : согласно комментариям, эта проблема была исправлена. Однако, это не решило конкретную проблему того, что слушатель не был вызван. Оказывается, произошла ошибка проверки. Это может произойти, когда метод equals() выбранного элемента не возвращает true для любого из элементов в списке на этапе применения значений запроса. Вы можете получить точную ошибку проверки, указав

<h:messages id="messages" />

и включите его идентификатор в атрибут render

<f:ajax render="locationSelector messages" ... /> 

Не связанный с конкретной проблемой, @ViewScoped - лучший выбор для этого. Таким образом, каждое окно / вкладка браузера в одном и том же сеансе браузера имеет свой собственный экземпляр компонента. Сеанс области действия bean-компонента совместно используется всеми окнами / вкладками браузера в пределах одного сеанса, что может привести к "wtf?" поведение, которое, таким образом, плохо для пользовательского опыта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...