Primefaces addCallbackParam возвращает пустой: false вместо фактического объекта

Я пытаюсь заменить компоненты 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

В связи с вышеизложенным мой вопрос: Почему я получаю «пусто: ложь» в качестве содержимого для частного списка?

Я использую Праймфейс 6.2.

ОБНОВЛЕНИЕ1:

Как и было предложено, я создал еще одну оболочку, содержащую только список, и попытался вернуть ее, как и раньше. Я также добавил список, чтобы проверить, возникает ли моя проблема только со строками. Результаты следующие:

@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>

Я также пытался создать некоторый локальный список (с начальными значениями и без них), но результат тот же, пустой: ложь / пустой: правда (соответственно).

Я даже пробовал это со старой версией 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.

Для saved вы не используете обратный вызов PrimeFaces, и у вас есть та же «проблема», так как же связан этот PrimeFaces? Вы проверили реальный сетевой трафик? И как customResult связан?

Kukeltje 24.01.2019 09:20

Мне кажется, что сериализатор PrimeFaces JSON неправильно десериализует List<String>, но он правильно сделал ваш объект CustomResult. Можете ли вы попробовать создать объект-оболочку, аналогичный вашему CustomResult, который просто содержит List<String> с сеттерами и геттерами в качестве единственного свойства.

Melloware 24.01.2019 13:24

@Kukeltje customResult позволяет мне проверить, можно ли вообще получить List<String> (и это видно из переменной event.data, возвращаемой с сервера.

zajer 24.01.2019 15:33

@melloware: saved был выполнен через RequestContect по умолчанию, а не через PF, если я правильно интерпретировал его в приведенном выше коде.

Kukeltje 24.01.2019 17:13

Так что это также может быть проблема десериализации. Проверка сетевого трафика должна показать

Kukeltje 24.01.2019 17:53

Сетевой трафик @Kukeltje показывает то же, что и переменная JS.

zajer 24.01.2019 22:11

Можешь попробовать 7.0CR1?

Kukeltje 25.01.2019 02:18

Я просто хотел бы добавить, что я потратил некоторое время на то, чтобы понять, почему у меня возникла такая же проблема, и это было потому, что я назвал событие «onsuccess» вместо «oncomplete».

Nikola 15.04.2019 01:27
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
8
1 429
0

Другие вопросы по теме