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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#1
кнопка и сервис в файле (админы - где вы, невозможно так код постить уже)
в либе код такой (изгалялся по-разному, но до него даже не доходит)
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>
 

Вложения

Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#2
прошу прощения, разобрался...
там же JS - надо было ф-цию нрмально описывать (как для JS)
в script= у сервиса
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#3
наступил еще на грабли...:
- вызов ф-ции, посчему-то работает только для 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());
}
посылает
Caused by: java.lang.ClassCastException: com.ibm.jscript.types.JavaAccessObject incompatible with com.ibm.jscript.std.ArrayObject
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#4
не знаю - с чем это связанно - не нашел "в ваших тырнетах"
передавать можно объекты, массивы (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 - ничего по теме не нашлось...
не верю - что никто не хотел предать просто массив
 

romych2004

Lotus team
01.04.2013
112
20
#5
сервис правильно описали? Параметр нужно описать как массив
Приложил пример, у меня работает
 

Вложения

  • 750 байт Просмотры: 13

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#6
сервис правильно описали? Параметр нужно описать как массив
Приложил пример, у меня работает
спасибо, с сервисом все правильно, НО в ф-ции, вызываемой, есть присвоение в viewScope (вот он не принимает массива через put, др. вариант не тестил, но думаю - то же), вот в ней рантайм и заворачивается
уже тестил, отписаться не успел
неприятность отладки в том, что жалуется на запрос (при таком сочетании)
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#8
Код:
viewScope[keys]=arr;
Никаких ошибок не выдал, все присвоил
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); получим ошибку
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#9
в данном случае xVal из CSJS выше
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#10
сервис
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>
 

romych2004

Lotus team
01.04.2013
112
20
#11
Ясно
У вас ошибка в том, что Вы возвращаете массив. Возвращать нужно либо строку либо ничего
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#12
Ясно
У вас ошибка в том, что Вы возвращаете массив. Возвращать нужно либо строку либо ничего
не совсем так
или мы др-др не понимаем
массив спокойно возвращается, но только не из viewScope (указанным способом)
вот так
JavaScript:
return tmp;//viewScope[xName];//viewScope.get(xName);
спокойно возвращает
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#13
др. словами:
  • запихнуть/вывести ассоциативный массив (аки map) - нет проблем
  • с массивом (простым) - проблема
вот так
JavaScript:
        viewScope[xName]=xVal;
        return viewScope[xName];//viewScope.get(xName);
споконо отработает, если на входе (xVal) - map
 

romych2004

Lotus team
01.04.2013
112
20
#14
И правда, там даже методы toString() по-разному отрабатывают. Один со скобками, другой без..
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#15
дополню, сюда, итератор объектов...
почему - да патамочта в 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]=...
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#16
очередные моя "плакать"...
сперва, как и в теме - возврат undefined - дефолтного рапера нет!
Caused by: com.ibm.commons.util.io.json.JsonException: Unknown literal of class com.ibm.jscript.types.FBSUndefined
т.е. возвратить из SSJS undefined (я возвращал внутри объекта с массивом) не получится
это какбэ странно
теперь про даты - как их сравнивать, а хз - потому как штатно они, при сравнении приводятся к стрингу
т.е.
JavaScript:
var dt:NotesDateTime, dt1:NotesDatetime;
...
while (dt<=dt1){...}
спросите - а чего я ожидал - приведения хотя бы к long (например - в ms)
мало того, в приведенном типе toJavaDate, я не нашел методов before и after, в подсказке, но они есть ;)
вопщем - цирк с конями
и это к теме - на чем лучше писать бэкэнд (SSJS или java) - для меня ответ очевиден
 
Последнее редактирование:

romych2004

Lotus team
01.04.2013
112
20
#17
очередные моя "плакать"...
сперва, как и в теме - возврат undefined - дефолтного рапера нет!т.е. возвратить из SSJS undefined (я возвращал внутри объекта с массивом) не получится
это какбэ странно
теперь про даты - как их сравнивать, а хз - потому как штатно они, при сравнении приводятся к стрингу
т.е.
JavaScript:
var dt:NotesDateTime, dt1:NotesDatetime;
...
while (dt<=dt1){...}
спросите - а чего я ожидал - приведения хотя бы к long (например - в ms)
мало того, в приведенном типе toJavaDate, я не нашел методов before и after, в подсказке, но они есть ;)
вопщем - цирк с конями
и это к теме - на чем лучше писать бэкэнд (SSJS или java) - для меня ответ очевиден
NotesDateTime.timeDifference()?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#19
тема будет всплывать ибо много "особенностей"
все они касаются вывода значений после вызова из 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));
получение массива из ч-л:
Для просмотра контента необходимо: Войти или зарегистрироваться

засада будет при конвертации (хотя там "вроде" 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));
закоменченный возврат - выдаст ошибку конвертации (выдаст его в клиент! ответом на запрос)
 

romych2004

Lotus team
01.04.2013
112
20
#20
Во-первых, что бросилось в глаза - это eval, зачем он тут нужен? Ты итак выводишь текст
Во-вторых, если передать в функцию toArray лист(а передается именно лист, а не вектор), то она вернет [лист](см. исходный код функции). А не сконверченный в массив