Неожиданное поведение области разговора - PullRequest
2 голосов
/ 27 августа 2011

У меня есть страница JSF, где пользователи могут ввести свой автомобиль в мою базу данных. Форма имеет три поля ввода:

  • Производитель
  • Модель
  • Регистрация

Поля Manufacturer и Model являются полями автозаполнения. Чтобы заполнить поле Model, мне нужно знать, какое значение выбрал пользователь в поле Manufacturer до отправки формы. Для этого я установил вызов AJAX, чтобы сообщить управляемому бину о выбранном значении:

<p:autoComplete id="manufacturer"
                minQueryLength="3"
                completeMethod="#{carController.complete}"
                forceSelection="true">
   <p:ajax event="itemSelect"
           listener="#{carController.manufacturerSelected}" />
</p:autoComplete>

А в управляемом бобе:

public void manufacturerSelected(SelectEvent se) {
    manufacturer = se.getObject().toString();
}

Поле автозаполнения и метод обработчика для модели выглядят примерно одинаково с незначительно различными значениями.

Чтобы сохранить значение manufacturer для нескольких запросов XHR, я установил для bean-компонента значение ConversationScoped и начинаю диалог аннотированным методом @PostConstruct:

@Named
@ConversationScoped
public class CarController implements Serializable {

@Inject
private Conversation conversation;

@PostConstruct
private void init() {
    conversation.begin();
}

Я ожидал бы, что компонент будет создан только один раз для страницы, потому что диалог еще не завершен, и сохранит значение в поле manufacturer. Это, однако, не выполняется, и компонент создается снова для каждого запроса XHR, в результате чего поле manufacturer также становится равным null. Установка точки останова в методе PostConstruct показала, что он на самом деле вызывается, как и метод manufacturerSelected.

Я подозреваю, что это как-то связано с тем, что я не передаю идентификатор разговора вручную, но в документации сказано, что этот идентификатор должен автоматически передаваться при любом запросе лиц. Действительно ли это так, и означает ли это, что запросы XHR не обязательно сталкиваются с запросами?

Редактировать: Установка точек останова в различных местах компонента указывает на то, что у каждого запроса XHR есть новый компонент (conversation.getId() постоянно меняется), поэтому я, очевидно, неправильно распространяю идентификатор. Как можно передать идентификатор с помощью p: ajax и где я могу получить его с помощью EL?

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Поскольку вы не используете разговор (по крайней мере, в приведенном вами примере), почему бы не использовать область просмотра? Это будет делать именно то, что вы хотите, без необходимости распространения идентификатора разговора.

Обратите внимание, что для работы @ViewScoped необходимо изменить bean-компонент на управляемый JSF-компонент (удалить @Named). Это происходит из-за ошибки проектирования / спецификации в Java EE 6. Если вы хотите продолжать использовать CDI, то доступно расширение Java EE 6 из Seam 3, которое исправляет эту ошибку.

0 голосов
/ 07 августа 2014

Да.Эта проблема связана с тем, что JSF 2 и Primefaces вместе не передают идентификатор разговора.Вы можете попробовать следующий обходной путь.(Это для других, кто окажется здесь из-за той же проблемы).

<p:autoComplete id="manufacturer"
            minQueryLength="3"
            completeMethod="#{carController.complete}"
            forceSelection="true" onchange="updateManufacturer([{name:'cid',value:'#{javax.enterprise.context.conversation.id}'}])">
</p:autoComplete>
<p:remoteCommand name="updateManufacturer" action="#{carController.manufacturerSelected}"
                                 process="manufacturer" />
...