我可以在 soap header 中使用 java 表达式语言吗?
can I use java Expression Language in soap header?
我正在处理安全的 Web 服务并使用 wsimport 工具创建客户端 classes。
我正在使用的 Web 服务只有在 soap 中收到以下格式的请求时才会发送响应 header
<wsse:Security xmlns:wsse="http://somename.xsd">
<wsse:UsernameToken xmlns:wsu="http://somename2.xsd">
<wsse:Username>${=(com.company.xxx.util.classname.getXXX("SomeString"))}</wsse:Username>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
我的问题是 ${=(com.company.xxx.util.classname.getXXX("SomeString"))}
在 Soap UI 工具中如何工作?
我们是否需要在 soap UI 中添加包含 class 的 jar?
如何在 java 代码中工作?
提前致谢
拉杰什
请注意,${=(com.company.xxx.util.classname.getXXX("SomeString"))}
它不是一种表达式语言(作为 EL for JSP...)。这是 SOAPUI 在 SOAP 请求中使用 groovy 代码的特定符号。
在 groovy
testStep 或 groovy
表达式中使用来自外部 jar 的 java class(就像您在 SOAP 请求中使用 ${=groovy exp}
符号)你必须在 SOAPUI_HOME/bin/ext
目录中添加 jar 库。将库复制到该目录后,重新启动 SOAPUI 以便它可以加载新库。
根据评论进行编辑:
我不确定你是否真的在问这个,但我给你一个可能的解释:
${=groovy exp}
表示法用于 SOAPUI 工具,SOAPUI 在发送请求之前使用 groovy 解析表达式并将值发送到 WS。
在 java 中,您不能使用此表示法,而且您不能不使用 java 代码发送 SOAP 请求:
<wsse:Security xmlns:wsse="http://somename.xsd">
<wsse:UsernameToken xmlns:wsu="http://somename2.xsd">
<wsse:Username>com.company.xxx.util.classname.getXXX("SomeString")</wsse:Username>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
因为 WS 会将 com.company.xxx.util.classname.getXXX("SomeString")
解释为用户名 "string" 值。您必须在您的客户端中评估 com.company.xxx.util.classname.getXXX("SomeString")
表达式,并在将其发送到您的 WS 之前更改请求中的值,因此您的客户端发送的请求必须类似于:
<wsse:Security xmlns:wsse="http://somename.xsd">
<wsse:UsernameToken xmlns:wsu="http://somename2.xsd">
<wsse:Username>someUserName</wsse:Username>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
然而,我觉得很奇怪,您通常手动创建 WSS headers
来生成这个 headers 使用了像 wss4j.jar
这样的框架。
希望这对您有所帮助,
我正在处理安全的 Web 服务并使用 wsimport 工具创建客户端 classes。
我正在使用的 Web 服务只有在 soap 中收到以下格式的请求时才会发送响应 header
<wsse:Security xmlns:wsse="http://somename.xsd">
<wsse:UsernameToken xmlns:wsu="http://somename2.xsd">
<wsse:Username>${=(com.company.xxx.util.classname.getXXX("SomeString"))}</wsse:Username>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
我的问题是 ${=(com.company.xxx.util.classname.getXXX("SomeString"))}
在 Soap UI 工具中如何工作?
我们是否需要在 soap UI 中添加包含 class 的 jar?
如何在 java 代码中工作?
提前致谢
拉杰什
请注意,${=(com.company.xxx.util.classname.getXXX("SomeString"))}
它不是一种表达式语言(作为 EL for JSP...)。这是 SOAPUI 在 SOAP 请求中使用 groovy 代码的特定符号。
在 groovy
testStep 或 groovy
表达式中使用来自外部 jar 的 java class(就像您在 SOAP 请求中使用 ${=groovy exp}
符号)你必须在 SOAPUI_HOME/bin/ext
目录中添加 jar 库。将库复制到该目录后,重新启动 SOAPUI 以便它可以加载新库。
根据评论进行编辑:
我不确定你是否真的在问这个,但我给你一个可能的解释:
${=groovy exp}
表示法用于 SOAPUI 工具,SOAPUI 在发送请求之前使用 groovy 解析表达式并将值发送到 WS。
在 java 中,您不能使用此表示法,而且您不能不使用 java 代码发送 SOAP 请求:
<wsse:Security xmlns:wsse="http://somename.xsd">
<wsse:UsernameToken xmlns:wsu="http://somename2.xsd">
<wsse:Username>com.company.xxx.util.classname.getXXX("SomeString")</wsse:Username>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
因为 WS 会将 com.company.xxx.util.classname.getXXX("SomeString")
解释为用户名 "string" 值。您必须在您的客户端中评估 com.company.xxx.util.classname.getXXX("SomeString")
表达式,并在将其发送到您的 WS 之前更改请求中的值,因此您的客户端发送的请求必须类似于:
<wsse:Security xmlns:wsse="http://somename.xsd">
<wsse:UsernameToken xmlns:wsu="http://somename2.xsd">
<wsse:Username>someUserName</wsse:Username>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
然而,我觉得很奇怪,您通常手动创建 WSS headers
来生成这个 headers 使用了像 wss4j.jar
这样的框架。
希望这对您有所帮助,