5

私の目的は、RPG 関数から開始された Java から Web サービスを呼び出すことです。(私は知っています、それは長い道のりですが、それは私たちが必要としているものです)

AS400 にフォルダーを作成し/JavaLib、必要なすべての外部 Jar をコピーしました。

WebServiceCaller.Call()Web サービスを呼び出す静的メソッドを持つ Java クラスを作成します。RPG プログラムを実行するときはいつでも、RPG がこのメソッドを呼び出すまでは問題ありません。

Java 例外が発生します。

メッセージ 。. . . : Java メソッド (CGD F) の呼び出し時に Java 例外を受け取りました。
原因 。. . . . : プログラム WAL60326/WEBSERCALR の RPG プロシージャー WEBSERCALR は
、シグネチャー「(LwebService.Input;)LwebService.Output;」でメソッド「Call」を呼び出したときに、Java 例外「java.lang.NoClassDefFoundError: javax.xml.rpc.ServiceException」を受け取りました。クラス
「webService.WebServiceCaller」で。

クラスパス変数:

/JavaLib:/home/WAL60326/WebServiceCaller

したがって、RPG と Java クラスは問題なく、CLASSPATH 変数を正しくセットアップしたと思います。他に何を確認する必要があるのか​​ わかりません。


アップデート

したがって、必要なjarファイルjaxrpc.jarはチェック済みです。それは私の中に存在します/JavaLib。AS400 で Java のバージョンを確認できましたjava version "1.5.0"。次の手順に従って、OS が V6R1 であることを確認します。

このJarファイルをロード/動作させるには、私のJavaバージョンが古くなっている可能性がありますか? その可能性さえありますか?


編集

ここに私のソースコードがあります:

Java: WebServiceCaller.Java

package webService;

import java.rmi.RemoteException;

import stocklistGetBids.GetBidsProxy;

public class WebServiceCaller {
    public static Output Call(Input in) { // Input Class, is just a way to hold all the input together
        Output out = null; // Output Class, holds all the output together

        try {
            GetBidsProxy getBidsProxy = new GetBidsProxy(); // GetBidsProxy generated by Eclipse 

            out = new Output(getBidsProxy.getBids(in.LogKey, in.Id));           

        } catch (RemoteException e) {
            e.printStackTrace();
            out = new Output("ERR"); 
        }

        return out;
    }
}

GetBidsProxy クラスは Eclipse によって生成されることに注意してください。Java 側は、私の Windows マシンでうまく動作します。AS400マシンではありません。

RPG: WEBSERCALR.RPGLE

 H DFTACTGRP(*NO)
 H thread(*serialize)

 D WebsercalInput  DS
 D   ReturnCode                   7A
 D   LogKey                      20A
 D   ID                          20A

 D jString         S               O   CLASS(*JAVA:'java.lang.String')
 D jLogKey         S               O   CLASS(*JAVA:'java.lang.String')
 D jID             S               O   CLASS(*JAVA:'java.lang.String')
 D Input           S               O   CLASS(*JAVA:'webService.Input')
 D Output          S               O   CLASS(*JAVA:'webService.Output')

 D new_Input       PR              O   EXTPROC(*JAVA:
 D                                       'webService.Input':
 D                                       *CONSTRUCTOR)
 D   LogKey                            like(jString)
 D   ID                                like(jString)

 D new_String      PR              O    EXTPROC(*JAVA:
 D                                       'java.lang.String':
 D                                       *CONSTRUCTOR)
 D  bytes                        30A    CONST VARYING

 D Call            PR                  like(Output)
 D                                     EXTPROC(*JAVA:
 D                                       'webService.WebServiceCaller':
 D                                       'Call')
 D                                     STATIC
 D  in                                 like(Input)

 D getReturnStat   PR              O   EXTPROC(*JAVA:
 D                                       'webService.Output':
 D                                       'getReturnedStatus')
 D                                     CLASS(*JAVA:'java.lang.String')

 D getBytes        PR         65535A   VARYING
 D                                     EXTPROC(*JAVA:
 D                                       'java.lang.String':
 D                                       'getBytes')

 C     *ENTRY        PLIST
 C                   PARM                    WebsercalInput

  /free
   jLogKey = new_String(LogKey);
   jID = new_String(ID);

   Input = new_Input(jLogKey:jID);

   Output = Call(Input);

   jString = getReturnStat(Output);

   ReturnCode = getBytes(jString);

   return;
  /End-Free
4

3 に答える 3

4

CLASSPATH は、最初に java コマンドを呼び出して JVM を開始するときに、特定のジョブに対して 1 回だけ読み取られます。その後 CLASSPATH が変更された場合、JVM は新しい CLASSPATH を認識したり使用したりしません。(新しいジョブを開始するために) サインオフしてからサインオンし、CLASSPATH を設定し (サインオン プログラムで行います)、作業中のクラスを使用してみます。

于 2013-08-23T14:58:20.877 に答える
0

RPG コードで Java を使用しましたが、コンテナー フォルダーを CLASSPATH に追加するだけでは不十分であることがわかりました。CLASSPATH で個々の jar を特定する必要がありました。

于 2013-12-26T22:58:25.507 に答える