Помимо некоторых пропущенных аннотаций я не вижу много неправильных. В любом случае, вот проверенное решение, основанное на вашем коде, которое должно работать. Сначала давайте определим вид. Это в основном то же самое, что и в вашем примере:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>SelectMany Example</title>
</h:head>
<h:body>
<h:form>
<p:selectManyMenu id="menuid"
value="#{selectManyBackingBean.selectedActivities}"
showCheckbox="true" scrollable="true" scrollHeight="150">
<f:selectItems value="#{selectManyBackingBean.activities}" var="activity" itemValue="#{activity}"
itemLabel="#{activity}" />
</p:selectManyMenu>
<p:commandButton value="ADD ACTIVITY" id="addId">
<p:ajax event="click" process="@form" update="menuid"
listener="#{selectManyBackingBean.onAddActivity}"/>
</p:commandButton>
</h:form>
</h:body>
</html>
Затем мы определяем базовый компонент:
@Data
@Named
@ViewScoped
public class SelectManyBackingBean implements Serializable {
private List<String> selectedActivities;
private List<String> activities;
int index;
@PostConstruct
private void init() {
activities = new ArrayList<>();
selectedActivities = new ArrayList<>();
index = 0;
}
public void onAddActivity(){
String activity = "Activity " + (index++);
activities.add(activity);
selectedActivities.add(activity);
}
}
Это должно дать вам ожидаемое поведение. Нажав три раза на кнопку ADD ACTIVITY , вы получите следующий результат:
Обратите внимание на небольшое изменение в командной кнопке из process="@this"
до process="@form"
. Это обеспечит включение всех изменений, внесенных вами в компонент, в отправку формы. Если вы сохраните его в исходном значении, любые нажатия на флажки в меню не будут сохраняться и будут сбрасывать записи в предыдущее значение при нажатии кнопки команды (это потому, что рассматриваемый компонент не включается при жизни цикл выполняется).