У меня есть служба на основе 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>
Даже я ни с кем не знаком, поэтому попробуй, можешь ли ты отправить образец, чтобы сделать то же самое, используя cxf :?




Вот как выглядит мой пример 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>
Как отправить собственное тело, то есть настраиваемый объект в теле запроса.
Как и в вашем коде, установите in body через процессор, или, может быть, это может помочь: .setBody(constant("abc"))
Вам нужно будет маршалировать 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");
}
Почему вы используете
spring-ws? Я не знаком с этим компонентом. Я обычно используюcxf:...