【问题标题】:SOAP client on Java 11Java 11 上的 SOAP 客户端
【发布时间】:2019-07-22 18:38:49
【问题描述】:

我需要使用一个 SOAP 服务,我在 spring 教程中看到我用于使用和接收服务的 java 类可以使用工具或框架自动生成。

问题是大多数教程都依赖于 JDK 中的 wsimport 工具……经过数小时的尝试后,我发现对于 Java 11,它已被弃用。 在此之后,我发现 thisthisthis 谈论了一些解决此问题的方法。我尝试了所有这些,但我的 gradle.build 开始围绕这个库生成依赖问题。我试图排除有问题的库,但它并没有解决问题。

所以我想知道如何以不那么修补的方式生成我的 SOAP 客户端类?

附加信息:这是一种合同优先的方法,服务在网络上,它是一个 ?wsdl url。

【问题讨论】:

  • 不幸的是,这对 SO 来说太宽泛了。您可以通过提供minimal reproducible example 和示例结果来获取有关您自己的代码的帮助。
  • 看看apache CXF。但我不知道它是否与 java 11 兼容。
  • user1531971 首先感谢您的回复。其次,尽管看起来很广泛,但我试图解决的任务很简单(我认为):使用 Java 11 使用 SOAP Web 服务。尽管如前所述,有多种方法,但我发现的大多数教程都依赖在 Java 11 正式弃用的工具上,或者是一些用于实现服务器和一切的框架。
  • 马丁弗雷,感谢您的回复。我看了一下apache CFX。它进展顺利,但随后 JAXB 开始产生多个问题。如前所述,对于 Java 11,它完全被删除了,通过一些变通方法,我能够包含它,但是以一种非常糟糕的方式......多个警告、不推荐使用的警告以及我团队的多个成员的一些不稳定行为.所以不幸的是我不得不退出它

标签: java spring gradle soap wsdl


【解决方案1】:
public BlnInitBookData initTrans(String ccode, String license) {
BlnInitBookData initBookData = null;
try {

    BlnInitBook request = new BlnInitBook();

    request.setLicenseType(license);
    request.setStrCinemaCode(ccode);

    initBookData = ((BlnInitBookResponse) getWebServiceTemplate().marshalSendAndReceive(hosted_server_URL, request,
            new SoapActionCallback("URL_of_SOAP_api"))).getServiceResponse1()
        .getBlnInitBookData();

} catch (final Exception e) {
    logger.error(this.getClass().getName() + e.getMessage);
}
return initBookData;}

在 Java 中,使用 WebServiceGatewaySupport 类,它对我有用。我生成了 SOAP 请求、响应类。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

我当然可以分享 :) 我的编码:

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class GusGetCompanyRawXml {

  public String getCompanyRawXmlData(String sessionKey, String polishVatId) {
    String outputString = "";
    try {
      URL url = new URL("https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc");
      URLConnection connection = url.openConnection();
      HttpURLConnection httpConn = (HttpURLConnection) connection;
      ByteArrayOutputStream bout = new ByteArrayOutputStream();
      String xmlInput =
          "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\"\n"
              + "xmlns:ns=\"http://CIS/BIR/PUBL/2014/07\" xmlns:dat=\"http://CIS/BIR/PUBL/2014/07/DataContract\">\n"
              + "<soap:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">\n"
              + "<wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>\n"
              + "<wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukajPodmioty</wsa:Action>\n"
              + "</soap:Header>\n"
              + "<soap:Body>\n"
              + "<ns:DaneSzukajPodmioty>\n"
              + "<ns:pParametryWyszukiwania>\n"
              + "<dat:Nip>"+polishVatId+"</dat:Nip>\n"
              + "</ns:pParametryWyszukiwania>\n"
              + "</ns:DaneSzukajPodmioty>\n"
              + "</soap:Body>\n"
              + "</soap:Envelope>";

      byte[] buffer;
      buffer = xmlInput.getBytes();
      bout.write(buffer);
      byte[] b = bout.toByteArray();
      String SOAPAction = "http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj";

      httpConn.setRequestProperty("Content-Length", String.valueOf(b.length));
      httpConn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
      httpConn.setRequestProperty("SOAPAction", SOAPAction);
      httpConn.setRequestProperty("sid", sessionKey);
      httpConn.setRequestMethod("POST");
      httpConn.setDoOutput(true);
      httpConn.setDoInput(true);
      OutputStream out = httpConn.getOutputStream();
//Write the content of the request to the outputstream of the HTTP Connection.
      out.write(b);
      out.close();
//Ready with sending the request.

//Read the response.
      InputStreamReader inputStreamReader = new InputStreamReader(httpConn.getInputStream(), "UTF-8");
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//
      String responseString = "";

//Write the SOAP message response to a String.
      while ((responseString = bufferedReader.readLine()) != null) {
        if (StringUtils.contains(responseString, "&lt;")) {
          String unescapedString = StringEscapeUtils.unescapeXml(responseString);
          String remove = StringUtils.remove(unescapedString, "\r");
          outputString = outputString + remove;
        }
      }
    } catch (IOException e){
      log.error("Get customer data from gus failed",e.getStackTrace());
    }
    return outputString;
  }
}

【讨论】:

    【解决方案3】:

    最后,我只是按照this 教程进行操作,该教程非常简单,允许我使用 SOAP Web 服务,然后构建一个 XML 文件来处理检索到的信息。希望 Java 11 在不久的将来对这种类型的服务有更好的支持,但同时我解决了我的问题,也许这篇文章对执行类似任务的人有用。

    【讨论】:

    • 非常感谢这个原始解决方案解决了我的问题。
    • 很高兴为您提供帮助!这是一个原始的解决方案,但它可以完成任务。
    • 非常好,感谢您,我可以删除整个旧的 java ee / web 服务代码,而且我的 jar 现在像羽毛一样轻:D
    • 看起来资源已在服务器上被阻止(403 响应)。如果可以的话,如果您能分享代码的主要思想,那就太好了。我对这个解决方案的实现是我无法再访问的代码(我离开了我工作的公司),我希望这些信息可用,因为它对我来说效果很好,而且没有太多资源当今的话题。在此先感谢 Piotr。
    • 链接失效了,可以在这里访问:web.archive.org/web/20210301220843/https://technology.amis.nl/…
    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2011-05-16
    相关资源
    最近更新 更多