Вызов метода для класса Java из Lotus script (LS2J)
самые достойные разработчики,
у меня возникли проблемы с вызовом метода в моем собственном классе java из агента сценария lotus.
мой упрощенный класс Java выглядит так
import lotus.domino.*;
public class MyClass{
/* .. omitted constructor and other methods .. */
public void myMethod(Document doc){
/* ... do things with the document object ...*/
}
}
теперь этот класс включен с правильным оператором use, и я могу перебирать classmethods на объекте class в Lotus script, чтобы получить подпись необходимых аргументов.
но когда я пытаюсь вызвать метод, я получаю LS2J: Parameter mismatch calling Method myMethod
Я пробовал оба с точечной нотацией на JavaObject (Нет, я не использую Mac ;)) и ADT
Dim doc as NotesDocument
Dim jSession As JavaSession
Dim jClass As JavaClass
Dim jObject As JavaObject
...
Set jSession = New JavaSession()
Set jClass = jSession.Getclass("MyClass")
Set jObject = jClass.Createobject()
Call jObject.myMethod(doc)
и соответственно
Dim jMethod as JavaMethod
...
Set jMethod = jClass.Getmethod("myMethod", "(Llotus/domino/Document;)V")
tmp = jMethod.Invoke(jObject,doc)
также я добавил обработку ошибок (OnError ..) распечатать результаты любого JavaError (+stacktrace), но они заканчиваются пустыми, поэтому никаких дополнительных подсказок нет.
Я использую дизайнерскую версию 9.0
любые идеи / указатели / gotchas? Это делает меня лысым.
2 ответов
вы используете правильный подход к вызову метода Java, но вы не можете передавать объекты бэкэнда Notes в качестве параметров.
вы можете проанализировать строку с универсальным идентификатором документа, например, а затем в своем методе Java искать документ, используя универсальный идентификатор.
кроме того, перенесите логику Lotusscript на Java: -)
возможно, Вам не нужен CreateObject..
вот как я это делаю:
Dim jSession As New JavaSession()
Dim jClass As JavaClass()
Set jClass = jSession.GetClass("MyClass")
If jClass.myMethod(doc) Then
добавлен полный пример
Java class:
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
public class GetFileFromUrl {
public static boolean getFileFromUrl(String imageUrl, String filePath) {
try {
URL url = new URL(imageUrl);
InputStream is = url.openStream();
OutputStream os = new FileOutputStream(filePath);
byte[] b = new byte[2048];
int length;
while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
is.close();
os.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
LotusScript:
UseLSX "*javacon"
Use "GetFileFromUrl"
Private Function GetFileFromUrl(url As String, outputPath As String) As Boolean
Dim jSession As New JavaSession
Dim jClass As JavaClass
Set jClass = jSession.GetClass("GetFileFromUrl")
If jClass.getFileFromUrl(url, outputPath) Then
GetFileFromUrl = True
End If
End Function