И REST, и SOAP Web Services для одного приложения

Мы создали приложение с помощью Spring и развернули его с Tomcat. У нас есть рабочий REST-интерфейс, однако у одного из наших клиентов есть только SOAP-клиент.

Я понимаю, что веб-служба SOAP и веб-служба REST не могут сосуществовать в одном и том же порту или приложении.

Каковы мои варианты приема запроса SOAP с минимальным развитием. Должен ли я принять пакет с мылом через интерфейс rest и проанализировать XML? Или я могу настроить интерфейс SOAP для связи с моим интерфейсом REST и ответить?

Я использую Gradle как инструмент сборки. Было бы неплохо иметь решение как часть одного файла WAR

Ответ 1

По моему опыту, вы можете смешивать SOAP и REST в том же приложении, если вы очень осторожны в пространствах имен XML для JAXB. Однако я бы не рекомендовал его, так как обновление означает риск другой стабильности. Вот что я рекомендую...

  • Настройка многопроектной сборки в gradle
  • Создайте три проекта: один для бизнес-логики, один для интерфейса REST и один для интерфейса SOAP.
  • Изменить интерфейс REST/SOAP для использования проекта общей бизнес-логики
  • Развертывание как две отдельные WAR

Должен ли я принять пакет мыла через интерфейс rest и проанализировать XML?

SOAP - это протокол, а не только формат, поэтому это, вероятно, не будет работать с большинством (каких?) фреймворков.

Или я могу настроить интерфейс SOAP для связи с моим интерфейсом REST и ответить?

Вероятно, вы могли бы за счет производительности и/или ремонтопригодности.

Ответ 2

У нас есть проект, имеющий аналогичные требования. Мы все еще должны поддерживать SOAP, и мы продвигаемся с ReST.

Нет причин, по которым они конфликтуют. Поскольку вы используете spring, вы можете даже иметь те же объекты домена, что и ответ, который будет настроен на использование XML и JSON в качестве ваших предпочтений.

Что вам нужно сделать, так это создать другой URI для этих двух. например someService/** для SOAP и some-rest для реализаций REST. У вас может быть слой обслуживания для обработки общей логики (в основном код, необходимый для конечной точки, а остальной контроллер - выбор необходимых данных с уровня обслуживания и отправка его для сортировки)

Просто добавьте запись в свой web.xml файл, чтобы указать путь останова и пути конечной точки...

Ответ 3

Похоже, что ваш веб-сервис - это прежде всего REST (это 2013), но вы должны поддерживать мыло для ограниченного случая. Я бы специально разработал веб-сервис с отдыхом, но, возможно, использовал отдельный механизм, чтобы указать серверу, что клиенту требуется поддержка мыла. Если возможно, попросите клиента мыла отправить заголовок http-запроса или использовать измененный URL-адрес, который, возможно, заканчивается на .soap. В любом случае нет причин, по которым вы не можете поддерживать оба протокола в одном приложении.

Ответ 4

Вы можете сделать это, выполнив следующие шаги:

 -Add annotation of both Rest and Soap on class implementation.
 -Creating interface to hold the method annotation for Soap.
 -Put Rest annotation on method in class implementation.
 -Configure "web.xml" file to add "servlet" for Rest implementation you use.  
 -Don't forget to create class extend Application like [ApplicationConfiguration.class].

1- Реализация класса

@javax.jws.WebService(endpointInterface = "com.test.ebpp.autopayment.tess.ejb.GService", targetNamespace = "http://ejb.test.autopayment.ebpp.tess.com/", serviceName = "ApplicationBusinessFacadeService", portName = "ApplicationBusinessFacadePort")
@Path(value = "/ApplicationBusinessFacadeService")
public class ApplicationBusinessFacadePortBindingImpl implements
    ApplicationBusinessFacade {
    @Override
    @POST
    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public ProcessResponse process(Process request) {
        //type your code 
    }
}

2- Сервисный интерфейс

@WebService(name = "ApplicationBusinessFacade", targetNamespace =   "http://ejb.gateway.ebpp.com/")
@XmlSeeAlso({
com.ebpp.gateway.ejb.ObjectFactory.class,
com.ebpp.ifxmessages.ObjectFactory.class
})
public interface ApplicationBusinessFacade {

@WebMethod
@WebResult(targetNamespace = "")
@RequestWrapper(localName = "process", targetNamespace = "http://ejb.gateway.ebpp.com/", className = "com.ebpp.gateway.ejb.Process")
@ResponseWrapper(localName = "processResponse", targetNamespace = "http://ejb.gateway.ebpp.com/", className = "com.ebpp.gateway.ejb.ProcessResponse")
public ProcessResponse process(
    @WebParam(name = "arg0", targetNamespace = "")
    Process arg0);
 }

3- web.xml

 <servlet>        
        <servlet-name>com.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
 </servlet>