Вызов метода Java из RPGLE (as400)
Мне нужно вызвать метод Java из RPGLE, я получаю следующую ошибку. Я думаю, что способ, которым я сделал прототип метода, неправильный.
Cause . . . . . : RPG procedure TESTJ in program TESTLIB/TESTJ received
Java exception "java.lang.NoSuchMethodError:
NumberToWord.strconvert([B)Ljava/lang/String;" when calling method
"strconvert" with signature "([B)Ljava.lang.String;" in class
"NumberToWord".
Мой код Java работает нормально. код что-то вроде ниже,
public class NumberToWord
{
.....
.
.
public static String strconvert(String nms) {
.
.
.
return nms;
}
}
Мой код RPGLE, который должен быть неправильным, таков:
/free
ctl-opt dftactgrp(*no) actgrp(*caller);
dcl-s String1 object(*java:'java.lang.String');
dcl-s String2 object(*java:'java.lang.String');
dcl-s str varchar(250);
dcl-s JAVA_String object( *JAVA :'java.lang.String' );
dcl-pr JAVA_toString like( JAVA_String )
extproc( *JAVA :
'java.lang.String' :
*constructor );
value varchar( 65535 ) const;
end-pr;
dcl-pr getNMTW static like( JAVA_String )
extproc( *JAVA :
'NumberToWord' :
'strconvert' );
value varchar(65535) const;
end-pr;
dcl-pr getBytes char(250) extproc(*java:'java.lang.String':'getBytes');
end-pr;
String1 = JAVA_toString('543'); //works fine
str = getBytes(String1); //works fine
String2 = getNMTW('12345'); //exception occurs at this point
str = getBytes(String2);
*INLR = *ON;
/END-FREE
Методы JAVA_toString и getBytes работают нормально, при отладке исключение возникает в функции getNMTW.
CLASSPATH уже установлен. Я думаю, что это хорошо, так как я получаю NoSuchMethodError вместо ошибки NoClassFound.
2 ответа
Я нашел ошибку.
когда JVM уже запущена, изменения не распознаются Java в этой работе, я должен выйти из системы и войти снова, чтобы увидеть изменения, которые я внес в функцию java.
Похоже, ваше объявление для функции getNMTW настроено на передачу varchar методу Java. Когда RPG вызывает Java, поле varchar преобразуется в байтовый массив Java. Поэтому сначала нужно преобразовать поле RPG в строку Java, а затем передать эту строку. Попробуй это:
dcl-pr getNMTW static like( JAVA_String )
extproc( *JAVA :
'NumberToWord' :
'strconvert' );
value object( *JAVA :'java.lang.String' ) ;
end-pr;
а потом:
String2 = JAVA_toString('12345');
String2 = getNMTW('12345');
Второй вариант - изменить метод Java getNMTW для принятия байтового массива, а затем преобразовать байтовый массив в строку в Java. Это мой предпочтительный метод, потому что он помогает сохранить код RPG менее загроможденным. Но в любом случае будет работать.