代码之家  ›  专栏  ›  技术社区  ›  zajer

Primefaces addCallbackParam返回空:改为false实际对象的

  •  0
  • zajer  · 技术社区  · 6 年前

    我试图用Primefaces的等价物替换RichFaces组件jsFunction和Poll。原因是,当我将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
    

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

    更新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"));
    }
    

    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.2iirc)上尝试过,结果也一样。 有没有可能这只是我的问题? 即使如此,为什么同样的列表作为POJO字段返回时也是“ok”? 我用的是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。 我的CustomResult类之所以被正确序列化的原因(在我看来)是一个普通的老java对象。

    0 回复  |  直到 6 年前