java - 如何在 Clojure/Java 中使用 SOAP?

标签 java soap clojure wsdl

我需要使用 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 中做到这一点?

最佳答案

毕竟我决定使用 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,但事实并非如此!如果我按照我在本文开头所写的方式创建连接,则此行中的网址将被忽略。我想通常也会忽略,但我没有100%测试它。但这句话欺骗了我。

也许有人可以解释为什么这些行带有硬编码的网址。

关于java - 如何在 Clojure/Java 中使用 SOAP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36230478/

相关文章:

java - java中的分而治之算法

Java 从 DAO 中删除重复的 try、catch、finally 样板文件

java - JCombobox、编辑器和渲染器相关

Java 点列表

clojure - Clojure封闭

clojure - Clojure中用于deftype'd对象的toString方法是什么?

web-services - SOAP 网络服务中的 WS Security 1.2 Delphi XE8 for sign body

c++ - 使用 axis2c 开发 Web 服务时如何访问轴骨架代码中的服务参数?

php - 如何缓存 php soapclient 响应?

scala - Tarjan 强连通分量算法的功能实现