SmartGWT - 覆盖tranformRequest和transformResponse

时间:2012-01-21 21:51:27

标签: java gwt datasource smartgwt

我正在使用SmartGWT在GWT上用GAE编写一个项目。

我有一个带对象的数据库,每个都有一个“父”对象和“儿子”,我正在使用TreeGrid来表示它们。我已经有了一个GWT-RPC服务来获取给定节点的儿子。

我现在需要的是以某种方式在打开树节点时扩展DataSource类s.t,我将能够使用我自己的服务去获取它的儿子 - 然后将它们作为TreeGrid可以使用的东西返回。

我知道我想覆盖transformRequest和transformResponse,但我不知道怎么做。任何代码示例/解释都将非常感谢!

这是我到目前为止所做的 - 不确定它是否远程正确:

              budgetTree.setDataSource(new DataSource() {

            @Override
            protected Object transformRequest(final DSRequest dsRequest) {

              expensesService.getExpensesByYear(2008,
                  new AsyncCallback<ExpenseRecord[]>() {

                    @Override
                    public void onSuccess(ExpenseRecord[] result) {
                      System.out.println("Returned " + result.length + " expense record ");            
                      dsRequest.setAttribute("dsResult", result);
                    }

                    @Override
                    public void onFailure(Throwable caught) {
                      System.out.println("Failed to run query");
                    }

                  });

              return dsRequest;
            }

            @Override
            protected void transformResponse(DSResponse response, DSRequest request,
                Object data) {    
              Record[] recs = request.getAttributeAsRecordArray("dsResult");
              response.setData(recs);
              super.transformResponse(response, request, data);
            }


          });

1 个答案:

答案 0 :(得分:1)

由于您自己正在执行实际请求,因此首先需要查看 setDataProtocol(DSProtocol.CLIENTCUSTOM);

然后在onSuccessonFailure中,您需要拨打processResponse()来拨打transformResponse()

public class MyDatasource extends DataSource{
    public MyDatasource(){
        setDataProtocol(DSProtocol.CLIENTCUSTOM)           
    }

    @Override
    protected Object transformRequest(final DSRequest dsRequest) {

          expensesService.getExpensesByYear(2008,
              new AsyncCallback<ExpenseRecord[]>() {

                @Override
                public void onSuccess(ExpenseRecord[] result) {
                  DSResponse response = new DSResponse();
                  System.out.println("Returned " + result.length + " expense record ");            
                  dsRequest.setAttribute("dsResult", result);
                  Record[] recs = request.getAttributeAsRecordArray("dsResult");
                  response.setData(recs);
                  processResponse(dsRequest.getRequestId(), dsResponse);
                }

                @Override
                public void onFailure(Throwable caught) {
                  DSResponse response = new DSResponse();
                  System.out.println("Failed to run query");
                  processResponse(dsRequest.getRequestId(), dsResponse);
                }

              });

          return dsRequest;
   }

}