Primefaces addCallbackParam返回empty:false而不是实际对象

时间:2019-01-24 05:06:59

标签: json ajax primefaces

我正在尝试用Primefaces的等效项替换RichFaces组件jsFunction和Poll。原因是当我在.xhtml页面中添加p:dialog时,出现了一些与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

关于上述我的问题是: 为什么我将“空:假”作为私人列表的内容?

我正在使用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>

我还尝试设置一些本地列表(带有和不带有初始值),但结果相同,分别为empty: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对象。

0 个答案:

没有答案