如何在 Clojure / Java 中使用 SOAP?

How to work with SOAP in Clojure / Java?

我需要使用 WSDL 文件连接到 SOAP。我在互联网上找到了一些解决方案。例如:

我可以使用 'wsimport -keep -d src path-fo.wsdl' 从 WSDL 生成 Java 类。但它会产生一些问题。

1) 当我使用 wsimport -keep -d src local-file.wsdl 时,wsimport 将生成 Java 类 以及此文件的完整路径。这意味着它只能在我的电脑上工作,而不是其他人,因为路径不同。另外除非我删除这个文件。我可以将 wsimport 与 http:// 一起使用,但有人告诉我最好将 wsdl 文件保留为本地文件。也许我必须将它与 http:// 一起使用,这是一个糟糕的建议。

2) 我想使用相同的代码连接到同一系统的不同实例。所以每次我需要使用不同的 URL 进行 WSDL 连接,但是 url 都被编码到 Java 文件中。

所以我需要的是:

灵活的 SOAP (WSDL) 连接 URL 到 WSDL 文件与同一系统的其他实例对话。

如何在 Clojure 中实现 / Java?

这不是网络搜索的区域,一些建议可以帮助您到达所需的位置。自我教育,可能在大师的帮助下,绝对是有帮助的。我知道这对于不需要定期执行此操作的人来说是个坏消息。像 Eclipse 这样的 IDE,像 CXF 或 Axis2 这样的框架将大有帮助。可以免费下载的 soapUI 是必不可少的。

将此视为资源的开始:Introductory JAX-WS tutorial for Eclipse using a top down approach

在您准备好做出决定之前坚持:wsdl 优先开发和文档文字样式。

毕竟我决定使用 wsimport

(import java.net.URL)
(import javax.xml.namespace.QName)
(import com.example.schema.Auth)
(import javax.xml.ws.Service) 
(import com.example.schema.AtomApiService)
(import com.example.schema.AtomApiServicePortType)

(let [url (URL. "https://www.foo.com")
      qname (QName. "http://schema.example.com", "AtomApiService")
      auth (doto (new Auth) (.setLogin "login") (.setPassword "password"))
      service (Service/create url qname)
      port (-> service (.getPort AtomApiServicePortType))
      orders (-> port (.getOrdersSpecified auth "0" 0 3 0 "2016-03-24 12:00:00"))]
  orders)

为什么?

我发现 Apache CXF 和其他解决方案太旧了,使用起来非常不好。即使安装 Apache CXF 也不是那么容易。就像 2000 年的解决方案一样。只是不想使用那样的解决方案。这是我的主观意见!如果您觉得使用 Apache CXF 很舒服,您可能应该使用它。

什么骗了我? wsimport 在 FooPortType 中生成许多行,如下所示:

@WebMethod(operationName = "GetOrdersStatuses", action = "https://www.foo.com/atom_api/call/atom_api&method=GetOrdersStatuses")
@WebResult(name = "GetOrdersStatusesReturn", partName = "GetOrdersStatusesReturn")
public String getOrdersStatuses(
    @WebParam(name = "authenticate", partName = "authenticate")
    Auth authenticate);

所以我预计 SOAP 的调用将使用这个 url,但不是!如果我按照我在 post 开头所写的方式创建连接,则此行中的 urls 将被忽略。我认为通常也会忽略,但我没有在 100% 上测试它。但是这条线骗了我。

也许有人可以解释为什么这些行是硬编码的 url。