5

我的目标是从 Java 调用 Web 服务,从 RPG 函数启动。(我知道,它还有很长的路要走,但这是我们需要的)

/JavaLib在 AS400 上创建了一个文件夹,并复制了我们需要的所有外部罐子。

使用静态方法创建一个 Java 类WebServiceCaller.Call()来调用 Web 服务。当我运行我的 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"。并按照这些说明检查我的操作系统是否为 V6R1。

会不会是我的 Java 版本过时了,才能加载/工作这个 Jar 文件?这还有可能吗?


编辑

这是我的源代码:

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;
    }
}

请注意,Eclipse 生成的 GetBidsProxy 类。Java 端在我的 Windows 机器上运行良好。只是不在 AS400 机器上。

角色扮演游戏: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 启动时。如果在那之后您的 CLASSPATH 发生了变化,JVM 将不会看到或使用新的 CLASSPATH。注销并打开(开始新工作),设置 CLASSPATH(我在我的登录程序中完成),然后尝试使用您正在使用的类。

于 2013-08-23T14:58:20.877 回答
1

如果 CLASSPATH 正确,那么要检查的另一件事是 RPG 程序中的 Java 原型。它需要与 Java 类定义完全匹配。

首先,100% 确定您的 jaxrpc.jar 包含您认为应该包含的所有类。启动 QShell,然后java tf /JavaLib/jaxrpc.jar. 确保你至少有这些:

javax/xml/rpc/Call.class             
javax/xml/rpc/ServiceFactory.class   
javax/xml/rpc/ServiceException.class 

接下来,用纯 Java 编写一个简单的概念验证程序,以确保所有部分都按您的预期工作。注意:JAX-RPC 已经过时并且在 Java 1.6 及更高版本中消失了。它已被 JAX-WS 取代。如果这是一个全新的应用程序,请考虑使用更新的实现。这篇 2006 年的DeveloperWorks文章解释了其中的一些差异。

一旦您编写了一个纯 Java 程序,就可以使用您使用的 Java 类并在 RPG 中对它们进行原型制作。假设您已经完成了所有这些,您能否编辑您的问题以显示 RPG *CLASS 原型和用于调用它们的 RPG 代码。基本上,看看阅读这个问题的人是否可以在不同的盒子上重新创建设置。

于 2013-08-26T17:14:33.087 回答
0

我在我的 RPG 代码中使用了一些 Java,但我发现将容器文件夹添加到 CLASSPATH 是不够的。我必须识别 CLASSPATH 中的各个 jar。

于 2013-12-26T22:58:25.507 回答