2016-10-31 3 views
0

Мне нужно вызвать java-метод из RPGLE, Im получает следующую ошибку. Я думаю, что путь, который я сделал прототипом метода, неверен.Вызвать метод java из RPGLE (as400)

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". 

My java code работает нормально. код является то, как показано ниже,

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.

ответ

1

Я нашел ошибку.

Когда JVM уже запущен, изменения не распознаются Java в этом задании Мне нужно снова зарегистрироваться и снова зарегистрироваться, чтобы увидеть изменения, внесенные в java-функцию.

http://www.ibm.com/developerworks/rational/cafe/docBodyAttachments/2681-102-2-7220/Troubleshooting_RPG_Calls_To_Java_v2.html#changeclasses

2

Похоже, что ваше объявление для функции 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 менее загроможденным. Но в любом случае это сработает.