Мне нужно использовать службу SOAP, и в весеннем учебном пособии я видел, что мои классы Java для использования и получения служб могут быть автоматически сгенерированы с использованием инструмента или фреймворка.
Дело в том, что большинство руководств полагаются на инструмент wsimport из JDK... и после многих часов попыток я обнаружил, что для Java 11 это устарело. После этого я обнаружил, что это, это и это говорят о некоторых обходных путях для этой проблемы. Я пробовал их все, но мой gradle.build начинает генерировать проблемы с зависимостями вокруг этих библиотек. Я пытался исключить проблемные библиотеки, но это не решает проблему.
Итак, мне интересно, как я могу генерировать свои клиентские классы SOAP не таким образом?
Дополнительная информация: это первый подход к контракту, служба находится в Интернете и является URL-адресом ?wsdl.
Взгляните на апач CXF. Но я пока не знаю, совместим ли он с Java 11.
user1531971 Прежде всего, спасибо за ответ. Во-вторых, как бы широко это ни казалось, задача, которую я пытался решить, была простой и минимальной (я думаю): использование веб-службы SOAP с использованием Java 11. И хотя, как уже упоминалось, существует несколько подходов, большинство руководств, которые я нашел, полагаются об инструментах, официально объявленных устаревшими для Java 11, или о некоторых фреймворках для реализации сервера и всего остального.
Мартин Фрей, спасибо за ответ. Я взглянул на apache CFX. Все шло гладко, но затем JAXB начал создавать множество проблем. Как уже упоминалось, для Java 11 он полностью удален, и, выполнив некоторые обходные пути, я смог включить его, но очень плохо ... несколько предупреждений, устаревшие предупреждения и некоторое нестабильное поведение для нескольких членов моей команды. . Так что мне пришлось отказаться от этого, к сожалению




В конце концов, я просто следовал учебнику это, который был достаточно простым и позволял мне использовать веб-службу SOAP, а затем создавать XML-файл для обработки полученной информации. Надеюсь, в ближайшем будущем в Java 11 будет улучшена поддержка этого типа сервиса, но тем временем я решил свою проблему, и, возможно, этот пост может быть полезен кому-то, кто выполняет аналогичную задачу.
Большое спасибо, это необработанное решение решило мою проблему.
Рад помочь! Это сырое решение, но оно работает.
Это отлично, благодаря Вам я смог удалить весь старый код java ee/веб-сервисов, и моя банка теперь легкая, как перо: D
Похоже, ресурс заблокирован на сервере (ответ 403). Если вы можете, было бы здорово, если бы вы могли поделиться основной идеей кода. Моя реализация этого решения представляет собой код, к которому я больше не могу получить доступ (я покинул компанию, в которой работал), и я хотел бы, чтобы эта информация была доступна, поскольку она работала так хорошо для меня, а на сайте не так много ресурсов. тема в наши дни. Заранее спасибо Петр.
ссылка битая, посмотреть можно здесь: web.archive.org/web/20210301220843/https://technology.amis.nl/…
конечно, что я могу поделиться :) моя кодировка:
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, "<")) {
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, классы ответов.
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
К сожалению, это слишком широко для SO. Вы можете получить помощь с собственным кодом, предоставив минимальный воспроизводимый пример и примеры результатов.