SOAP-клиент на Java 11

Мне нужно использовать службу SOAP, и в весеннем учебном пособии я видел, что мои классы Java для использования и получения служб могут быть автоматически сгенерированы с использованием инструмента или фреймворка.

Дело в том, что большинство руководств полагаются на инструмент wsimport из JDK... и после многих часов попыток я обнаружил, что для Java 11 это устарело. После этого я обнаружил, что это, это и это говорят о некоторых обходных путях для этой проблемы. Я пробовал их все, но мой gradle.build начинает генерировать проблемы с зависимостями вокруг этих библиотек. Я пытался исключить проблемные библиотеки, но это не решает проблему.

Итак, мне интересно, как я могу генерировать свои клиентские классы SOAP не таким образом?

Дополнительная информация: это первый подход к контракту, служба находится в Интернете и является URL-адресом ?wsdl.

К сожалению, это слишком широко для SO. Вы можете получить помощь с собственным кодом, предоставив минимальный воспроизводимый пример и примеры результатов.

user1531971 28.02.2019 20:14

Взгляните на апач CXF. Но я пока не знаю, совместим ли он с Java 11.

Martin Frey 28.02.2019 20:22

user1531971 Прежде всего, спасибо за ответ. Во-вторых, как бы широко это ни казалось, задача, которую я пытался решить, была простой и минимальной (я думаю): использование веб-службы SOAP с использованием Java 11. И хотя, как уже упоминалось, существует несколько подходов, большинство руководств, которые я нашел, полагаются об инструментах, официально объявленных устаревшими для Java 11, или о некоторых фреймворках для реализации сервера и всего остального.

José Ripoll 29.03.2019 23:19

Мартин Фрей, спасибо за ответ. Я взглянул на apache CFX. Все шло гладко, но затем JAXB начал создавать множество проблем. Как уже упоминалось, для Java 11 он полностью удален, и, выполнив некоторые обходные пути, я смог включить его, но очень плохо ... несколько предупреждений, устаревшие предупреждения и некоторое нестабильное поведение для нескольких членов моей команды. . Так что мне пришлось отказаться от этого, к сожалению

José Ripoll 29.03.2019 23:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
7 538
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В конце концов, я просто следовал учебнику это, который был достаточно простым и позволял мне использовать веб-службу SOAP, а затем создавать XML-файл для обработки полученной информации. Надеюсь, в ближайшем будущем в Java 11 будет улучшена поддержка этого типа сервиса, но тем временем я решил свою проблему, и, возможно, этот пост может быть полезен кому-то, кто выполняет аналогичную задачу.

Большое спасибо, это необработанное решение решило мою проблему.

Piotr Żak 29.04.2020 21:07

Рад помочь! Это сырое решение, но оно работает.

José Ripoll 08.05.2020 00:41

Это отлично, благодаря Вам я смог удалить весь старый код java ee/веб-сервисов, и моя банка теперь легкая, как перо: D

Piotr Żak 08.05.2020 14:04

Похоже, ресурс заблокирован на сервере (ответ 403). Если вы можете, было бы здорово, если бы вы могли поделиться основной идеей кода. Моя реализация этого решения представляет собой код, к которому я больше не могу получить доступ (я покинул компанию, в которой работал), и я хотел бы, чтобы эта информация была доступна, поскольку она работала так хорошо для меня, а на сайте не так много ресурсов. тема в наши дни. Заранее спасибо Петр.

José Ripoll 09.06.2020 01:40

ссылка битая, посмотреть можно здесь: web.archive.org/web/20210301220843/https://technology.amis.n‌​l/…

CarlosRuiz 29.10.2021 16:16

конечно, что я могу поделиться :) моя кодировка:

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;
  }
}
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, классы ответов.

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 02.12.2021 17:24

Другие вопросы по теме