Community Tip - Did you get an answer that solved your problem? Please mark it as an Accepted Solution so others with the same problem can find the answer easily. X
I'm facing some problems when trying to use an infoTable in my extension.
The service is a utility service that is static:
public static void myService(Context cx, Scriptable me, Object[] args, Function func) throws Exception {
InfoTable iTable= (InfoTable) args[0];
...
in the metaData:
<FunctionDefinition description=""
name="myService
<ParameterDefinitions>
<FieldDefinition baseType="INFOTABLE"
aspect.dataShape="keysShape"
aspect.isEntityDataShape="true"
description="the key names" name="keys" ordinal="0" />
</ParameterDefinitions>
<ResultType baseType="NOTHING" name="result"
ordinal="0" />
</FunctionDefinition>
The call from the javascript;
let keys= Resources["InfoTableFunctions"].CreateInfoTableFromDataShape({
infoTableName: "InfoTable",
dataShapeName: "keysShape"
});
keys.AddRow({key:"a string"});
myService(keys);
The problem if at this line:
InfoTable iTable= (InfoTable) args[0];
I get this exception:
Error executing service PrivateInitializeFastQueryCache. Message :: class com.thingworx.dsl.engine.adapters.ThingworxInfoTableAdapter cannot be cast to class com.thingworx.types.InfoTable (com.thingworx.dsl.engine.adapters.ThingworxInfoTableAdapter and com.thingworx.types.InfoTable are in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @4e4efc1b) - See Script Error Log for more details.
Any Idea?
Solved! Go to Solution.
Finally, I did that in the extension:
InfoTable users = ((ThingworxInfoTableAdapter) args[0]).getInfoTable();
And it works fine.
Any comment?
Try to convert to JSON when calling to service.
let keys= Resources["InfoTableFunctions"].CreateInfoTableFromDataShape({
infoTableName: "InfoTable",
dataShapeName: "keysShape"
});
keys.AddRow({key:"a string"});
myService(keys.ToJSON());
from
Finally, I did that in the extension:
InfoTable users = ((ThingworxInfoTableAdapter) args[0]).getInfoTable();
And it works fine.
Any comment?
I am a little confused about your method signature. I know signatures like
@ThingworxServiceDefinition(name = "Greeting", description = "Hello world")
@ThingworxServiceResult(name = "Result", description = "Result", baseType = "STRING")
public String Greeting(@ThingworxServiceParameter(name = "userToGreet", description = "The user you're greeting", baseType = "USERNAME") String
userToGreet)throws Exception {
return "Hello " + userToGreet + ". How are you?";
}
And with this syntax you just define baseType as INFOTABLE.
That service is from an example in the ThingWorx_Extension_Development_Guide (I only found the guide for 8.3. Not sure where 9.x is - should be in helpcenter but had no luck) .
This is java extension. My example was a simple javascript service.
your example is okay. I am confused about the java extension code from the original question.
It seems there are 2 ways to define the twx services in the extension:
1- with anotation
2- in the metadata file
Can someone confirm ?
You can define services in a Java Extension through annotations (the preferred way) or at runtime via addServiceDefinition(though less flexible).
I am not sure what you meant when saying it's possible to add services in metadata file - any example on how to do that?
Look at the beginning of the thread. You have the example!
What you are doing is called "Script Function Libraries". I found it in the "ThingWorx Extension Development Guide" I referenced to before.
I do not have experience with it and the docs do not show much documentation for this. Guess I cannot help futher