Вызов службы на основе SOAP с использованием компонента Apache Camel и spring-ws

У меня есть служба на основе SOAP, которая принимает некоторый предопределенный объект запроса,

например, AccountRequest, имеющий несколько полей.

Образец кода

from("direct:test")
    .routeId("account.get")
    .process(exchange -> {
        exchange.getIn().setBody(createAccountRequest());
    })
    .to("spring-ws:http://localhost:8090/AccountServices/AccountOverviewService")
    .log("Got Request for account-detail");
}

Приведенный выше код вызывает ошибку

org.apache.camel.NoTypeConversionAvailableException: 
No type converter available to convert from type: 
com.test.AccountRequest to the required type: 
javax.xml.transform.Source with value com.test.AccountRequest@4e1c1763

Это правильный способ вызвать мыльную службу через верблюда?

Зависимости

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
    <version>2.18.3</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-ws</artifactId>
    <version>2.18.3</version>
</dependency>

Почему вы используете spring-ws? Я не знаком с этим компонентом. Я обычно использую cxf:...

vikingsteve 24.05.2018 10:22

Даже я ни с кем не знаком, поэтому попробуй, можешь ли ты отправить образец, чтобы сделать то же самое, используя cxf :?

Yogesh Prajapati 24.05.2018 10:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
2 061
2

Ответы 2

Вот как выглядит мой пример SOAP WS с использованием cxf.

Во-первых, в camel-context.xml определите bean-компонент веб-службы:

<cxf:cxfEndpoint id = "insuranceService"
                 address = "http://localhost:8080/insuranceService"
                 serviceClass = "com.mycompany.insurance.insurancePort"
                 wsdlURL = "schema/InsuranceService.wsdl">
</cxf:cxfEndpoint>

Теперь верблюжий маршрут выглядит так:

from("somewhere")
    .to("cxf:bean:insuranceService")

И вам могут понадобиться такие зависимости:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-cxf</artifactId>
        <version>${framework.camel}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>${framework.cxf}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-http</artifactId>
        <version>${framework.camel}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-jaxb</artifactId>
        <version>${framework.camel}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-soap</artifactId>
        <version>${framework.camel}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-saxon</artifactId>
        <version>${framework.camel}</version>
    </dependency>

Как отправить собственное тело, то есть настраиваемый объект в теле запроса.

Yogesh Prajapati 24.05.2018 11:32

Как и в вашем коде, установите in body через процессор, или, может быть, это может помочь: .setBody(constant("abc"))

vikingsteve 24.05.2018 12:32

Вам нужно будет маршалировать com.test.AccountRequest в xml, добавив

  JaxbDataFormat jaxb = new JaxbDataFormat(false); //add
  jaxb.setContextPath("com.accountservice.model"); //add - path to your generated stubs

    from("direct:test")
        .routeId("account.get")
        .process(exchange -> {
            exchange.getIn().setBody(createAccountRequest());
        })
        .marshal(jaxb) //add
        .to("spring-ws:http://localhost:8090/AccountServices/AccountOverviewService")
        .log("Got Request for account-detail");
    }

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