Я пытаюсь заменить компоненты RichFaces jsFunction и Poll эквивалентами Primefaces.Причина этого в том, что когда я добавляю p: dialog на страницу .xhtml, я получаю некоторые ошибки, связанные с jQuery.
Так много для фона.
Я создал простой bean-компонент, как показано ниже:
@Named
@SessionScoped
public class PollableBean implements Serializable {
@Getter
private List<String> resultOfPolling = new ArrayList<>( Arrays.asList("abc","def","ghi"));
public CustomResult gimmeData(){
System.out.println(resultOfPolling);
List<String> resultButLocal = resultOfPolling;
PrimeFaces pf = PrimeFaces.current();
pf.ajax().addCallbackParam("customResult",resultOfPolling);
RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("saved", resultButLocal); //basic parameter
String[] sa = new String[]{"na1","na2","na3"};
int[] ia = {3,4,5};
CustomResult cr = CustomResult.builder()
.p1("name")
.v1(3)
.va1(ia)
.pa1(sa)
.pl1(Arrays.asList(sa))
.vl1(IntStream.of(ia)
.boxed()
.collect(Collectors.toList())
)
.build();
pf.ajax().addCallbackParam("event.data", cr);
return cr;
}
}
Определение класса CustomResult таково:
@Getter
@Setter
@Builder
public class CustomResult {
String p1;
int v1;
String[] pa1;
int[] va1;
List<String> pl1;
List<Integer> vl1;
}
Моя страница, которая вызывает опрос, выглядит следующим образом:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Facelet Title</title>
<h:outputScript name ="js/test.js"/>
</h:head>
<h:body>
<h:form>
<h:outputText id="txt_count" value="#{counterView.number}" />
<p:poll interval="10" listener="#{pollableBean.gimmeData()}" oncomplete="myFunc1(xhr,status,args)" />
</h:form>
<script>
myFunc2();
</script>
</h:body>
И здесьэто моя проблемаКогда я проверяю в консоли, какие значения я на самом деле получаю, я вижу что-то вроде этого:
{saved: {…}, customResult: {…}, event.data: {…}}
customResult:
empty: false
__proto__: Object
event.data:
p1: "name"
pa1: (3) ["na1", "na2", "na3"]
pl1: (3) ["na1", "na2", "na3"]
v1: 3
va1: (3) [3, 4, 5]
vl1: (3) [3, 4, 5]
__proto__: Object
saved:
empty: false
__proto__: Object
__proto__: Object
В связи с вышеизложенным мой вопрос звучит так: почему я получаю «empty: false» в качестве контента для частного списка?
Я использую Primefaces 6.2
UPDATE1:
Как и предполагалось, я создал еще одну оболочку, содержащую только List, и попытался вернуть ее, как раньше.Я также добавил список, чтобы проверить, появляется ли моя проблема только со строками.Результаты следующие:
@Getter
private List<String> resultOfPolling = new ArrayList<>( Arrays.asList("abc","def","ghi"));
private List<Integer> anotherPollRes = new ArrayList<Integer>();
public CustomResult gimmeData(){
System.out.println(resultOfPolling);
List<String> resultButLocal = resultOfPolling;
PrimeFaces pf = PrimeFaces.current();
RequestContext context = RequestContext.getCurrentInstance();
pf.ajax().addCallbackParam("customResult",resultOfPolling);
context.addCallbackParam("saved", resultButLocal);
CustomResult cr = prepCR();
pf.ajax().addCallbackParam("event.data", cr);
LSWrapper elsw = new LSWrapper();
pf.ajax().addCallbackParam("default wrapper", elsw);
LSWrapper lsw = new LSWrapper(resultOfPolling);
pf.ajax().addCallbackParam("wrapper", lsw);
pf.ajax().addCallbackParam("another", anotherPollRes);
return cr;
}
Класс оболочки:
@AllArgsConstructor
@NoArgsConstructor
public class LSWrapper {
@Getter
@Setter
private List<String> onlyProp = new ArrayList<>(Arrays.asList("abc","def","ghi"));
}
Получено JSON:
another: {empty: true}
customResult: {empty: false}
default wrapper: {onlyProp: Array(3)}
event.data: {pa1: Array(3), p1: "name", pl1: Array(3), va1: Array(3), vl1: Array(3), …}
saved: {empty: false}
wrapper: {onlyProp: Array(3)}
ОБНОВЛЕНИЕ 2:
Просмотр сетевого трафикас помощью встроенных инструментов Chrome я получил следующий результат:
<?xml version='1.0' encoding='UTF-8'?><partial-response id="j_id1"><changes><update id="j_id1:javax.faces.ViewState:0"><![CDATA[-887312468948943065:-278897396377742194]]></update><extension ln="primefaces" type="args">{"saved":{"empty":false},"another":{"empty":true},"default wrapper":{"onlyProp":["abc","def","ghi"]},"wrapper":{"onlyProp":["abc","def","ghi"]},"customResult":{"empty":false},"event.data":{"p1":"name","pa1":["na1","na2","na3"],"pl1":["na1","na2","na3"],"va1":[3,4,5],"vl1":[3,4,5],"v1":3}}</extension></changes></partial-response>
Я также пытался установить какой-то локальный список (с начальными значениями и без них), но результат тот же, пустой: false / empty: true (соответственно).
Я даже попробовал это со старой версией Primefaces (5.2 iirc), и произошло то же самое.Возможно ли, что это только моя проблема?Даже тогда, почему тот же список «хорошо», когда он возвращается как поле POJO?Я использую Glassfish 4.1.
ОБНОВЛЕНИЕ 3: Я думаю, что это ожидаемое поведение в конце концов.Документация по адресу: https://www.primefaces.org/docs/api/6.2/org/primefaces/PrimeFaces.Ajax.html#addCallbackParam-java.lang.String-java.lang.Object- гласит, что в настоящее время поддерживаются следующие объекты: POJO, JSONObjects и JSONArrays.
Насколько мне известно, универсальные классы, реализующие некоторые интерфейсы, не являются POJO.И причина, по которой мой класс CustomResult был правильно сериализован, заключается (на мой взгляд) в том, что это простой старый объект Java.