У меня есть WSDL со мной .eg:/sample/hello? wsdl. Я хочу вызвать службу webservice, настроив Spring -ws. Я передал этот wsdl как параметр в теги в springconfig.xml. Кто-нибудь может рассказать мне, как использовать этот веб-сервис в Spring -ws.
Использовать службу webservice в SPRING -WS с помощью wsdl
Ответ 1
1. Настроить зависимости проекта
добавьте следующие зависимости в файл pom:
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.5</version>
</dependency>
2. Настройка контекста приложения веб-службы
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="com.yourcomany.model" />
</bean>
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory" />
<property name="marshaller" ref="marshaller"></property>
<property name="unmarshaller" ref="marshaller"></property>
<property name="messageSender">
<bean
class="org.springframework.ws.transport.http.HttpComponentsMessageSender" />
</property>
<property name="defaultUri"
value="http://<hostname>:<portnumber>/sample/hello" />
</bean>
</beans>
3. Настройте классы моделей, которые будут отображаться на ваши объекты запроса/ответа SOAP
Например, если ваш XML-запрос SOAP выглядел как
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xxx="http://yourcomapny.com">
<soapenv:Header/>
<soapenv:Body>
<xxx:InputParameters>
<xxx:paramONE>1</xxx:paramONE>
</xxx:InputParameters>
</soapenv:Body>
</soapenv:Envelope>
и ваш XML-ответ SOAP выглядел так:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
...
</env:Header>
<env:Body>
<xxx:OutputParameters xmlns:xxx="http://yourcompany.com">
<xxx:paramONE>0</xxx:paramONE>
</xxx:OutputParameters>
</env:Body>
</env:Envelope>
соответствующие классы (в пакете, указанном в маршаллере bean: com.yourcompany.model), будут соответственно:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "paramONE" })
@XmlRootElement(name = "InputParameters", namespace = "http://yourcompany.com")
public class InputParameters {
@XmlElement(required = true, namespace = "http://yourcompany.com")
private String paramONE;
public String getParamONE() {
return paramONE;
}
public void setParamONE(String paramONE) {
this.paramONE = paramONE;
}
}
и
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "paramONE" })
@XmlRootElement(name = "OutputParameters", namespace = "http://yourcompany.com")
public class OutputParameters {
@XmlElement(required = true, namespace = "http://yourcompany.com")
private BigDecimal paramONE;
public BigDecimal getParamONE() {
return this.paramONE;
}
public void setParamONE(BigDecimal paramONE) {
this.paramONE= paramONE;
}
}
4. Добавьте объект Factory (в пакете com.yourcompany.model), чтобы создать объекты запроса/ответа
@XmlRegistry
public class ObjectFactory {
public ObjectFactory() {
}
public InputParameters createYourRequest() {
return new InputParameters();
}
public OutputParameters createYourResponse() {
return new OutputParameters();
}
}
5. Создайте клиента для использования службы
Интерфейс:
public interface YourService {
BigDecimal getValue(String paramOne);
}
Реализация
@Component("yourServiceClient")
public class YourServiceClient implements YourService {
private static final ObjectFactory WS_CLIENT_FACTORY = new ObjectFactory();
private WebServiceTemplate webServiceTemplate;
@Autowired
public YourServiceClient(WebServiceTemplate webServiceTemplate) {
this.webServiceTemplate = webServiceTemplate;
}
@Override
public BigDecimal getValue(String paramOne) {
InputParameters request = WS_CLIENT_FACTORY
.createYourRequest();
request.setParamONE(paramOne);
OutputParameters response = (OutputParameters) webServiceTemplate
.marshalSendAndReceive(request);
return response.getParamONE();
}
}
Ответ 2
@Taoufik Mohdit ответ завершен!!
Чтобы создать входные и выходные объекты, вы можете использовать Webservice-Client: общий подход с Spring WS, JAXB и только одним файлом WSDL? для некоторых способов сборки эти объекты автоматически
Ответ 3
Учитывая, что этот вопрос все еще активен, я подумал, что опубликую обновление, отражающее ряд изменений, которые вносят недавняя версия среды Spring Web Services и Spring в целом:
- Внедрение Spring Boot позволяет использовать "стартовые" POM для упрощения конфигурации Maven. Для Spring-WS существует специальный
spring-boot-starter-web-services
- Вместо указания файлов конфигурации Spring с использованием XML был представлен Spring JavaConfig, который предоставляет безопасную для типов опцию на чистом Java для настройки Spring.
- Генерация объектов запроса/ответа на основе данного файла WSDL может быть автоматизирована с помощью плагинов Maven. Плагин, используемый примерами Spring-WS, - это
maven-jaxb2-plugin
.
WebServiceTemplate
по-прежнему является основным классом для доступа к веб-сервисам на стороне клиента. Для получения дополнительной информации вы можете проверить этот подробный пример того, как использовать веб-сервис с использованием Spring-WS, начиная с файла WSDL, который я написал.