我可以在 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 这样的框架。

希望这对您有所帮助,