jsonRpcService/CSJS->SSJS->CSJS ошибка запроса

Тема в разделе "Lotus - Xpages", создана пользователем lmike, 10 авг 2016.

Метки:
  1. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    кнопка и сервис в файле (админы - где вы, невозможно так код постить уже)
    в либе код такой (изгалялся по-разному, но до него даже не доходит)
    Код (Javascript):
    function rpcSetViewScope(xName:string, xVal:string){
        try{
            viewScope.put("\""+xName+"\"",xVal);
            return xVal;
        } catch (e) {
            return 'SSJS Error: ' + e.toString();
        }
    }
     
    ошибка:
    Caused by: java.lang.ClassCastException: com.ibm.jscript.std.FunctionObject incompatible with com.ibm.jscript.std.ObjectObject
    at com.ibm.jscript.json.JsonJavaScriptFactory.getProperty(JsonJavaScriptFactory.java:87)
    это ответ сервера клиенту (браузеру) на POST (кот. по кнопке)
    Код (XML):

    <xe:jsonRpcService id="rpcScope" pathInfo="rpcScope"
           serviceName="rpcScope">
            <xe:this.methods>
                <xe:remoteMethod name="setViewScope"
                   script="rpcSetViewScope">
                    <xe:this.arguments>
                        <xe:remoteMethodArg name="xName" type="string"></xe:remoteMethodArg>
                        <xe:remoteMethodArg name="xVal" type="string"></xe:remoteMethodArg>
                    </xe:this.arguments>
                </xe:remoteMethod>
            </xe:this.methods>
        </xe:jsonRpcService>

        <xp:button value="XHR" id="button1" onclick="xhr();">

        <xp:eventHandler event="onclick" submit="false">
            <xp:this.script><![CDATA[try{
       rpcScope.setViewScope("test","test").addCallback(function(xVal){
       console.log("xVal:"+xVal);});
    } catch (e) {
       alert(e.toString());
    }]]></xp:this.script>
        </xp:eventHandler></xp:button>
     
     

    Вложения:

    • jsonrpc.xml.zip
      Размер файла:
      474 байт
      Просмотров:
      4
    #1 lmike, 10 авг 2016
    Последнее редактирование модератором: 15 авг 2016
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    прошу прощения, разобрался...
    там же JS - надо было ф-цию нрмально описывать (как для JS)
    в script= у сервиса
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    наступил еще на грабли...:
    - вызов ф-ции, посчему-то работает только для Static value (в динамике не
    - не могу передать массив (ни keys=[]; ни =new Array();... )
    Код (Javascript):
    try{
            var keys=new Array();
            keys.push("one");
            keys.push("two");
            keys.push("three");
        rpcScope.setViewScope("keys",keys).addCallback(function(xVal){
            try{
                console.log("xVal:"+xVal);
            }catch (e){
                alert(e.toString());
            }
        });
    } catch (e) {
        alert(e.toString());
    }
    посылает
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    не знаю - с чем это связанно - не нашел "в ваших тырнетах"
    передавать можно объекты, массивы (JS) - нет
    т.е. можно передать
    Код (Javascript):
    try{
        var keys={};
        keys[1]="val1";
        keys[2]="val2";
        rpcScope.setViewScope("keys",keys).addCallback(function(xVal){
            try{
                console.log("xVal:"+xVal);
            }catch (e){
                alert(e.toString());
            }
        });
    } catch (e) {
        alert(e.toString());
    }
    на выходе будет
    непонятным остается - почему поиски на тему JSON RPC list array - ничего по теме не нашлось...
    не верю - что никто не хотел предать просто массив
     
  5. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    55
    Симпатии:
    4
    сервис правильно описали? Параметр нужно описать как массив
    Приложил пример, у меня работает
     

    Вложения:

    • rpc.txt
      Размер файла:
      750 байт
      Просмотров:
      6
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    спасибо, с сервисом все правильно, НО в ф-ции, вызываемой, есть присвоение в viewScope (вот он не принимает массива через put, др. вариант не тестил, но думаю - то же), вот в ней рантайм и заворачивается
    уже тестил, отписаться не успел
    неприятность отладки в том, что жалуется на запрос (при таком сочетании)
     
    #6 lmike, 12 авг 2016
    Последнее редактирование: 12 авг 2016
  7. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    55
    Симпатии:
    4
    Код (Text):
    viewScope[keys]=arr;
    Никаких ошибок не выдал, все присвоил
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    Код (Javascript):
    function rpcSetViewScope(xName:string, xVal){
        //return rpcGetChartData();
        try{
            var tmp=[];
            for (var val in xVal){
                tmp.push(xVal[val]);
                print("value:"+xVal[val]);
            }
          //  viewScope.put(xName,tmp);
            return viewScope.get(xName);
        } catch (e) {
            return 'SSJS Error: ' + e.toString();
        }
    }
     
    рскоментируем viewScope.put(xName,tmp); получим ошибку
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    в данном случае xVal из CSJS выше
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    сервис
    Код (XML):
        <xe:jsonRpcService id="jsonRpcService1" pathInfo="rpcScope"
           serviceName="rpcScope">
            <xe:this.methods>
                <xe:remoteMethod name="setViewScope"
                   script="return rpcSetViewScope(xName,xVal);">
                    <xe:this.arguments>
                        <xe:remoteMethodArg name="xName" type="string"></xe:remoteMethodArg>
                        <xe:remoteMethodArg name="xVal" type="list"></xe:remoteMethodArg>
                    </xe:this.arguments>
                </xe:remoteMethod>
            </xe:this.methods>
        </xe:jsonRpcService>
     
     
  11. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    55
    Симпатии:
    4
    Ясно
    У вас ошибка в том, что Вы возвращаете массив. Возвращать нужно либо строку либо ничего
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    не совсем так
    или мы др-др не понимаем
    массив спокойно возвращается, но только не из viewScope (указанным способом)
    вот так
    Код (Javascript):
    return tmp;//viewScope[xName];//viewScope.get(xName);
    спокойно возвращает
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    др. словами:
    • запихнуть/вывести ассоциативный массив (аки map) - нет проблем
    • с массивом (простым) - проблема
    вот так
    Код (Javascript):
            viewScope[xName]=xVal;
            return viewScope[xName];//viewScope.get(xName);
     
    споконо отработает, если на входе (xVal) - map
     
  14. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    55
    Симпатии:
    4
    И правда, там даже методы toString() по-разному отрабатывают. Один со скобками, другой без..
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    дополню, сюда, итератор объектов...
    почему - да патамочта в SSJS не будет работать более комфортный вариант
    Код (Javascript):
    Object.keys(myArray).length
    , кот. есть в CSJS (движок браузера посвежее будет ;) , чем rhino у домины)
    иногда "нужно" получить элементы объекта но не в порядке размещения, ассоциативный массив JS, в отличии от LS не будет соблюдать порядок внесения элементов (вот ведь "странно" ;), а "мы" так привыкли в LS)
    ассоциировать объекты, в таком случае, можно с номером (это коряво, но хоть что-то, если "надо" передавать именно ассоциативный массив), пример для SSJS:
    Код (Javascript):
    function rpcGetChartData(map){
            Object.size = function(obj) {
                var size = 0, key;
                for (key in obj) {
                    if (obj.hasOwnProperty(key)) size++;
                }
                return size;
            };
    //....
            var keyV:java.util.Vector=historyV(@Today());
            for(var i=0; i<Object.size(map);i++){
                keyV.addElement(map[i]);
            }
     
    где var map={};map[1]=...
     
    #15 lmike, 18 авг 2016
    Последнее редактирование: 19 авг 2016
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    очередные моя "плакать"...
    сперва, как и в теме - возврат undefined - дефолтного рапера нет!
    т.е. возвратить из SSJS undefined (я возвращал внутри объекта с массивом) не получится
    это какбэ странно
    теперь про даты - как их сравнивать, а хз - потому как штатно они, при сравнении приводятся к стрингу
    т.е.
    Код (Javascript):
    var dt:NotesDateTime, dt1:NotesDatetime;
    ...
    while (dt<=dt1){...}
    спросите - а чего я ожидал - приведения хотя бы к long (например - в ms)
    мало того, в приведенном типе toJavaDate, я не нашел методов before и after, в подсказке, но они есть ;)
    вопщем - цирк с конями
    и это к теме - на чем лучше писать бэкэнд (SSJS или java) - для меня ответ очевиден
     
    #16 lmike, 26 авг 2016
    Последнее редактирование: 26 авг 2016
  17. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    55
    Симпатии:
    4
    NotesDateTime.timeDifference()?
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    не вижу отличия от
    Код (Javascript):
    dt.toJavaDate().before(dt1)
    и странно что именно этот вариант не подсвечивается в коде(в том и неудовольствие)
     
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.074
    Симпатии:
    300
    тема будет всплывать ибо много "особенностей"
    все они касаются вывода значений после вызова из CSJS к SSJS
    вот очередной экзерциз...
    Код (Javascript):
    var tmp=eval("#{javascript:return rpcSummaryMnth(viewScope.get('curyear'), viewScope.get('curmonth'), true)}");
    хотеть - массив.
    в SSJS:
    Код (Javascript):
            var key:String=context.getUser().getCommonName()+"|"+year+@Right("00"+month,2);
            var entry:NotesViewEntry=entryByKey(vname, key);
            var v:java.util.Vector=entry.getColumnValues();
            //forecast summary by month
            //return 2 years or 1
            print("key:"+key);
            var tmp=$CONV.toArray(full?v.subList(2,25):v.subList(2,13));
    получение массива из ч-л: https://openntf.org/XSnippets.nsf/snippet.xsp?id=convert-any-value-to-an-array
    засада будет при конвертации (хотя там "вроде" JS массив ;) ) для возврата клиенту.
    кастыль:
    Код (Javascript):
            var arr=new Array();
            arr.push(0)
            for(var i=0; i<tmp.length; i++){
                //to escape trouble with return to CSJS (json convert)
                arr.push(tmp[i]);
            }
            return arr;//$CONV.toArray(full?v.subList(2,25):v.subList(2,13));
    закоменченный возврат - выдаст ошибку конвертации (выдаст его в клиент! ответом на запрос)
     
  20. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    55
    Симпатии:
    4
    Во-первых, что бросилось в глаза - это eval, зачем он тут нужен? Ты итак выводишь текст
    Во-вторых, если передать в функцию toArray лист(а передается именно лист, а не вектор), то она вернет [лист](см. исходный код функции). А не сконверченный в массив
     
Загрузка...
Похожие Темы - jsonRpcService CSJS >SSJS
  1. victorhalf
    Ответов:
    3
    Просмотров:
    224
  2. ty3uk
    Ответов:
    9
    Просмотров:
    638
  3. Cheburan
    Ответов:
    9
    Просмотров:
    624
  4. alexas1
    Ответов:
    1
    Просмотров:
    451
  5. alexas
    Ответов:
    0
    Просмотров:
    1.043

Поделиться этой страницей