Ответ 1
Вы можете посмотреть исходный код класса WsdlValidator в проекте soapUI с открытым исходным кодом.
https://github.com/SmartBear/soapui
http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/support/wsdl/WsdlValidator.html
Мне нужно проверить сообщение SOAP на WSDL
?
(так же, как файл XML
может быть проверен с помощью схемы XSD
).
Я не звоню в какой-либо веб-сервис;
У меня просто есть сообщение SOAP
и WSDL
, и мне нужно проверить правильность сообщения SOAP
.
без вызова веб-службы или после этого.
Мне нужно сделать эту проверку в рамках программы Java. Знаете ли вы о небольшой библиотеке Java для этого?
ps: Я знаю, что несколько библиотек JAX-WS
могут проверять запрос/ответ при вызове webservice. Но опять же, я не звоню в какой-либо веб-сервис; У меня есть простое сообщение SOAP
и WSDL
, и мне нужна функция, которая проверяет сообщение SOAP
на WSDL
.
ps: Я также знаю, что есть инструменты, которые могут это сделать, например SOAPUI
и XMLSpy
. Опять же, мне нужно выполнить эту проверку в моей программе Java.
ps: Я знаю, что я мог извлечь часть тела сообщения SOAP
и проверить его на XSD
. Тем не менее, я бы хотел проверить все сообщение SOAP
на WSDL
.
Вы можете посмотреть исходный код класса WsdlValidator в проекте soapUI с открытым исходным кодом.
https://github.com/SmartBear/soapui
http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/support/wsdl/WsdlValidator.html
Если вы создаете клиент webservice с использованием генератора кода на основе Apache CXF или Apache Axis 2, вероятность того, что ваш код веб-службы будет работать нормально, пока не будет работать как поставщик веб-службы, так и ваш клиент в той же версии SOAP/WS *. Основываясь на API, который вы выбираете для вызова веб-сервиса, вы можете узнать, может ли возможность ведения журнала этого API использоваться для распечатки созданного запроса SOAP.
Другим подходом может быть использование такого инструмента, как SOAPUI. Вы можете попытаться настроить mock webservice с использованием SOAP UI на основе WSDL, который у вас есть, а затем вызывать тестирование вашего клиента webservice, вызывая макет службы. См. Ссылку на SOAP UI здесь http://www.soapui.org/Getting-Started/web-service-sample-project/1-Web-Service-Mocking.html
Я думаю, что вы можете искать ответ, слишком сложный для того, что вам действительно нужно. Все, что вам действительно нужно сделать, - это зарегистрировать соответствующие документы DTD/XSD, чтобы нормальные классы JAXP могли ссылаться на них.
Этот код, из Sun/Oracle, реализует базовый EntityResolver
. Вы должны построить этот класс таким образом, чтобы он предоставил DocumentBuilder
соответствующий InputSource
для схемы, определенной в документах, которые вы пытаетесь проверить.
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
public class MyResolver implements EntityResolver {
public InputSource resolveEntity (String publicId, String systemId) {
if (systemId.equals("http://www.myhost.com/today")) {
// return a special input source
MyReader reader = new MyReader();
return new InputSource(reader);
} else {
// use the default behaviour
return null;
}
}
}
Используя этот код, вы можете использовать свой собственный EntityResolver
и использовать его во время разбора/проверки документа.
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware = true;
dbf.setValidating = true;
final DocumentBuilder db = dbf.newDocumentBuilder();
final MyResolver r = MyResolver.newInstance();
db.setEntityResolver(r);
final Document docFromFile = db.parse("path/to/my/document.xml");
// or
final Document docFromStream = db.parse(new FileInputStream("blah"));
Вы можете создать заглушку, используя WSDL, который у вас есть, и затем сделать запрос на заглушку, используя ваш XML-запрос. Если это правильно, ваш запрос правильный.
Вы можете импортировать WSDL в свой проект, а затем сделать звонок к службе-заглушке, используя ваш XML. Таким образом, вы можете вносить изменения в проверки без каких-либо изменений в коде.
Попробуйте это
В обработчике попробуйте приведенный ниже код
в public boolean handleRequest(MessageContext mc)
добавить эти строки
mc.setProperty("USE_TEST_FILE", <your response in .xml file>);
return false;
В public boolean handleResponse(MessageContext mc)
String testFileName = (String) mc.getProperty("USE_TEST_FILE");
InputStream instream = <read file as an input stream>
SOAPMessageContext smc = (SOAPMessageContext) mc;
SOAPMessage message = smc.getMessage();
SOAPPart soapPart = message.getSOAPPart();
soapPart.setContent(new StreamSource(instream));
smc.setMessage(message);
return false;
теперь запустите прокси-сервер.. прокси-сервер потерпит неудачу, если сообщение недействительно для WSDL
Поскольку сообщение SOAP равно xml, вы можете проверить целостное сообщение против xsd. Например, я нашел эту схему для сообщения SOAP. Вы могли:
Если вы хотите выполнить проверку против определенного WSDL, вы можете подготовить свою схему вручную: просто разместите корневой элемент своего сообщения вместо этой части:
<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
в схеме SOAP.
Подтвердите против схему конверта SOAP, затем извлеките тело и заголовки и проверьте на соответствие конкретной схеме. Должно быть достаточно простым.
Посмотрите API Apache AXIS2.