Метод GWT-RPC возвращает пустой список в случае успеха

Я создаю веб-страницу с CellTable. Мне нужно заполнить эту таблицу данными из таблицы hbase.

Я написал метод для извлечения данных из таблицы hbase и протестировал его.

Но когда я вызываю этот метод как GWT асинхронный метод RPC, тогда вызов rpc завершается успешно, но он ничего не возвращает. В моем случае он возвращает пустой список. Поле предупреждения показывает размер списка как 0.

Ниже приведен соответствующий код.

Пожалуйста помоги.

greetingService.getDeviceIDData(new AsyncCallback<List<DeviceDriverBean>>(){
                    public void onFailure(Throwable caught) {
                        // Show the RPC error message to the user
                        System.out.println("RPC Call failed");
                        Window.alert("Data : RPC call failed");

                    }

                    public void onSuccess(List<DeviceDriverBean> result) {                      
                        //on success do something
                        Window.alert("Data : RPC call successful");
                        //deviceDataList.addAll(result);                    
                        Window.alert("Result size: " +result.size());                       


                        // Add a text column to show the driver name.
                        TextColumn<DeviceDriverBean> nameColumn = new TextColumn<DeviceDriverBean>() {
                            @Override
                            public String getValue(DeviceDriverBean object) {
                                Window.alert(object.getName());
                                return object.getName();

                            }
                        };
                        table.addColumn(nameColumn, "Name");

                        // Add a text column to show the device id      
                        TextColumn<DeviceDriverBean> deviceidColumn = new TextColumn<DeviceDriverBean>() {
                            @Override
                            public String getValue(DeviceDriverBean object) {
                                return object.getDeviceId();
                            }
                        };
                        table.addColumn(deviceidColumn, "Device ID");
                        table.setRowCount(result.size(), true);

// more code here to add columns in celltable
                        // Push the data into the widget.
                        table.setRowData(0, result);
                        SimplePager pager = new SimplePager();
                        pager.setDisplay(table);
                        VerticalPanel vp = new VerticalPanel();
                        vp.add(table);
                        vp.add(pager);      

                        // Add it to the root panel.
                        RootPanel.get("datagridContainer").add(vp);
                    }                   
                }); 

Код для извлечения данных из hbase (код на стороне сервера)

public List<DeviceDriverBean> getDeviceIDData()
            throws IllegalArgumentException {

        List<DeviceDriverBean> deviceidList = new ArrayList<DeviceDriverBean>();

        // Escape data from the client to avoid cross-site script
        // vulnerabilities.
        /*
         * input = escapeHtml(input); userAgent = escapeHtml(userAgent);
         * 
         * return "Hello, " + input + "!<br><br>I am running " + serverInfo +
         * ".<br><br>It looks like you are using:<br>" + userAgent;
         */

        try {
            Configuration config = HbaseConnectionSingleton.getInstance()
                    .HbaseConnect();
            HTable testTable = new HTable(config, "driver_details");
            byte[] family = Bytes.toBytes("details");
            Scan scan = new Scan();
            int cnt = 0;
            ResultScanner rs = testTable.getScanner(scan);
            for (Result r = rs.next(); r != null; r = rs.next()) {

                DeviceDriverBean deviceDriverBean = new DeviceDriverBean();
                byte[] rowid = r.getRow(); // Category, Date, Sentiment
                NavigableMap<byte[], byte[]> map = r.getFamilyMap(family);
                Iterator<Entry<byte[], byte[]>> itrt = map.entrySet()
                        .iterator();

                deviceDriverBean.setDeviceId(Bytes.toString(rowid));

                while (itrt.hasNext()) {

                    Entry<byte[], byte[]> entry = itrt.next();
                    //cnt++;
                    //System.out.println("Count : " + cnt);

                    byte[] qual = entry.getKey();
                    byte[] val = entry.getValue();

                    if (Bytes.toString(qual).equalsIgnoreCase("account_number")) {
                        deviceDriverBean.setAccountNo(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("make")) {
                        deviceDriverBean.setMake(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("model")) {
                        deviceDriverBean.setModel(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("driver_name")) {
                        deviceDriverBean.setName(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("premium")) {
                        deviceDriverBean.setPremium(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("year")) {
                        deviceDriverBean.setYear(Bytes.toString(val));
                    } else {
                        System.out.println("No match found");
                    }
                    /*
                     * System.out.println(Bytes.toString(rowid) + " " +
                     * Bytes.toString(qual) + " " + Bytes.toString(val));
                     */
                }

                deviceidList.add(deviceDriverBean);
            }
        }

        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        catch (Exception e) {
            // System.out.println("Message: "+e.getMessage());
            e.printStackTrace();
        }

        return deviceidList;

    }

2 ответа

У меня нет точного ответа, но у меня есть совет. В подобной ситуации я поставил свой собственный след, чтобы проверить каждый шаг в моей программе. На стороне сервера перед возвратом поставьте: System.out.println("size of table="+deviceidList.size()); Вы можете поместить эту трассировку в цикл для deviceidList;

Может ли это быть ленивым извлечением на стороне сервера с помощью hbase. Это означает, что если вы вернете список, hbase не получит триггер для фактического чтения списка, и вы просто получите пустой список. Я не знаю правильного решения, в прошлом я видел подобную проблему на GAE. Это можно решить, просто спросив размер списка непосредственно перед возвратом его клиенту.

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