我创建了一个Web服务使用者。我想调用一个名为setCredentials
的方法,以便将身份验证信息传递给服务。
我有两个导入web服务使用者的实体,一个代理和一个java库,它们将从LotusScript调用。
奇怪的是,在我的经纪人身上,一切都很好。库编译正常,但当它从LotusScript执行并到达该行时stub.setCredentials("xxxx","ttttt");
Java抛出一个java.lang.nosuchmethod
错误。我做错了什么?
事先非常感谢你的帮助。
更新:
也许我没有充分解释。该操作完全发生在java内部。这是一种测试。在LotusScript上,我只是用GetClass/CreateObject序列调用构造函数。代码在构造函数中(为了测试)。在我的测试代理和java库上,它看起来完全一样。回答您的问题,Jason,不,setCredentials是某个lotus.domino.types.PortTypeBase接口的一部分。当我使用.wsdl创建web服务使用者时,我可以从生成的.java文件中看到我的接口扩展了portTypeBase和Remote
不可能从LotusScript(LS2J)调用Java Web服务使用者。这在SPR SODY7UDKE8/APAR LO42772中有详细说明。这也适用于调用Java代理,而Java代理又调用Java使用者。
您将需要创建一个LotusScript使用者来访问LotusScript中的web服务。然而,LotusScript中存在一些已知的限制,这些限制可能会阻止使用某些web服务。
- 40个字符的变量/方法限制
- 超大的SOAP消息可能会导致性能/崩溃问题
- LS/WSDL/SOAP中的保留关键字不匹配
也就是说,我创建了以下示例Provider。
Class wsClass
Function hello ( helloText As String) As String
hello = "Hello " + helloText
End Function
End Class
它存储在NSF中,我将其设置为只允许经过身份验证的用户。
然后,我从生成的WSDL中创建了一个LS使用者和Java使用者库。
之后,我创建了以下示例代码。
LotusScript
Use "LsWebServiceConsumer"
Sub Initialize
Dim stub As New Wsclass
Dim answer As String
Call stub.Setcredentials("testuser", "password")
answer = stub.Hello("world")
MsgBox answer
End Sub
JAVA(向代理添加了消费者库)
import lotus.domino.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
WsClass stub = new WsClassServiceLocator().getDomino();
stub.setCredentials("testuser", "password");
System.out.println(stub.HELLO("world"));
} catch(Exception e) {
e.printStackTrace();
}
}
}
这两种方式都与各自的消费者一样发挥了预期的作用。