У меня есть страница 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?