6

I can send callback param(s) and it works perfectly as long as I am only sending some primitive types like String. But the same thing does not work for even the simplest POJO. PrimeFaces guide says that the RequestContext.addCallbackParam() method can handle POJOs and it coverts them into JSON. I don't know why it's not working in my case.

Has anybody done that?

Bhesh Gurung
  • 50,430
  • 22
  • 93
  • 142

1 Answers1

6

Solution found! ---------------------------------------------------------------------

I did some research and found the answer to this question.

And the solution was to use some JSON library (right now I am using GSON) to convert Java objects to JSON objects.

new Gson().toJson(someJavaObj)

returns string. Just send the string as the param and on the client side using js' eval or some js library's function to turn that into JSON again.

Actually, it was pretty clean and simple.

Sorry I actually did not post the solution. Below is the my solution -

Action method in the backing bean -

public void retrievePieData() { 
    List<String> categories = new ArrayList<String>();

    categories.add("Electronic");
    categories.add("Food");
    categories.add("Liguor");
    categories.add("Stationary");
    categories.add("Mechanical");

    List<Integer> itemCounts = new ArrayList<Integer>();

    itemCounts.add(5);
    itemCounts.add(20);
    itemCounts.add(1);
    itemCounts.add(50);
    itemCounts.add(10);

    RequestContext reqCtx = RequestContext.getCurrentInstance();
    reqCtx.addCallbackParam("categories", new Gson().toJson(categories));
    reqCtx.addCallbackParam("itemCounts", new Gson().toJson(itemCounts));
}

PrimeFaces p:commandButton in the view -

<p:commandLink action="#{pieDataProvider.retrievePieData}" oncomplete="feedPieData(xhr, status, args);"  value="Pie chart demo" update="pieData" />

Javascript function -

function feedPieData(xhr, status, args) {
    var categories = eval('(' + args.categories + ')');
    var itemCounts = eval('(' + args.itemCounts + ')');

    options.xAxis.categories = categories;

    var series = {
         data: []
    };

    series.name = new Date().toString();
    series.data = itemCounts;

    options.series = [series];

    chart = new Highcharts.Chart(options);
}

I would really appreciate and welcome any suggestion or opinion. Thank you!

Bhesh Gurung
  • 50,430
  • 22
  • 93
  • 142
  • You can also use `org.primefaces.json.*` which is based on http://www.json.org/javadoc/org/json/JSONObject.html and already included with Primefaces. – Murat Derya Özen Feb 05 '12 at 18:50
  • @BheshGuruang I did the same thing as converting to json but used Jackson insteand GSON. In the http resonse the data has backslash for ecah double quote, due to it i cannot parse it in the script. Do you have same issue? – user1595858 Aug 30 '12 at 03:22