...
Code Block |
---|
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<configuration>
<sourceDestDir>${modules.output.directory}</sourceDestDir>
<wsdlDirectory>${modules.import.directory}</wsdlDirectory>
<bindingDirectory>${modules.import.directory}</bindingDirectory>
<bindingFiles>
<bindingFile>jaxb_global_bindings.xjb</bindingFile>
</bindingFiles>
</configuration>
<executions>
<execution>
<id>WSDL-import-in-hello-model</id>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<staleFile>${project.build.directory}/jaxws/.in.hello.model</staleFile>
<packageName>org.openhubframework.openhub.modules.in.hello.model</packageName>
<wsdlFiles>
<wsdlFile>hello-v1.0.wsdl</wsdlFile>
</wsdlFiles>
<bindingFiles>
<bindingFile>jaxb_global_bindings.xjb</bindingFile>
<bindingFile>jaxb_common_bindings.xjb</bindingFile>
</bindingFiles>
</configuration>
</execution>
</executions>
</plugin> |
Publishing WSDL/XSD
sw
Route implementations
sw
publish WSDL/XSD files - add configuration to /META-INF/sp_ws_wsdl.xml. sws:static-wsdl is used for publishing WSDL, Web service configuration for openhub-example module is in org.openhubframework.openhub.modules.ExampleWebServiceConfig:
- helloWsdl() publishes WSDL
- helloOperations() publishes XSD with requests and responses
- publishing WSDL and XSD files have to be published separately. See Spring Web Services reference manual where you find more information because Spring WS is underlying library for web service communication.
- register XSD schemas for validation incoming/outgoing messages in configuration of "validatingInterceptor" (class HeaderAndPayloadValidatingInterceptor)
- traceHeader is mandatory for asynchronous requests only - set synchronnous requests in ignoreRequests property to ignore this validation
configure conversion to Java classes - use jaxws-maven-plugin Maven plugin for conversion from WSDL or jaxb2-maven-plugin for conversion from XSD
Code Block |
---|
@Configuration
@Profile(ExampleProperties.EXAMPLE_PROFILE)
public class ExampleWebServiceConfig {
static final ClassPathResource HELLO_OPERATIONS_XSD_RESOURCE = new ClassPathResource(
"org/openhubframework/openhub/modules/in/hello/ws/v1_0/helloOperations-v1.0.xsd");
@Bean(name = "helloOperations-v1.0")
public XsdSchema helloOperations() {
return new SimpleXsdSchema(HELLO_OPERATIONS_XSD_RESOURCE);
}
@Bean(name = "hello")
public SimpleWsdl11Definition helloWsdl() {
SimpleWsdl11Definition wsdl = new SimpleWsdl11Definition();
wsdl.setWsdl(new ClassPathResource(
"org/openhubframework/openhub/modules/in/hello/ws/v1_0/hello-v1.0.wsdl"));
return wsdl;
}
} |
Implementation of WebServiceValidatingSources that registers XSD schemas for validation incoming/outgoing messages (traceHeader is mandatory for asynchronous requests only - set synchronnous requests to ignore requests)
Code Block |
---|
@Component
@Profile(ExampleProperties.EXAMPLE_PROFILE)
public class ExampleWebServiceValidatingSources implements WebServiceValidatingSources {
@Override
public Resource[] getXsdSchemas() {
return new Resource[] {ExampleWebServiceConfig.HELLO_OPERATIONS_XSD_RESOURCE};
}
@Override
public String[] getIgnoreRequests() {
return new String[] {"{http://openhubframework.org/ws/HelloService-v1}syncHelloRequest"};
}
} |
Route implementations
- Camel has Spring web services (spring-ws) component for definition of incoming endpoint
- use handy function getInWsUri() from parent class that creates spring-ws endpoint with all necessary settings
- adhere name conventions with using getRouteId() method
- classes SyncHelloRequest and SyncHelloResponse are generated by jaxws-maven-plugin mentioned above
Code Block |
---|
@CamelConfiguration(value = SyncHelloRoute.ROUTE_BEAN)
@Profile(ExampleProperties.EXAMPLE_PROFILE)
public class SyncHelloRoute extends AbstractBasicRoute {
static final String ROUTE_BEAN = "syncHelloRouteBean";
private static final String OPERATION_NAME = "syncHello";
private static final String ROUTE_ID_SYNC_HELLO = getRouteId(ServiceEnum.HELLO, OPERATION_NAME);
static final String HELLO_SERVICE_NS = "http://openhubframework.org/ws/HelloService-v1";
@Override
protected void doConfigure() throws Exception {
from(getInWsUri(new QName(HELLO_SERVICE_NS, "syncHelloRequest")))
.routeId(ROUTE_ID_SYNC_HELLO)
.policy(RouteConstants.WS_AUTH_POLICY)
.to("throttling:sync:" + OPERATION_NAME)
.unmarshal(jaxb(SyncHelloRequest.class))
.log(LoggingLevel.DEBUG, "Calling hello service with name: ${body.name}")
.bean(this, "composeGreeting")
.marshal(jaxb(SyncHelloResponse.class));
}
@Handler
public SyncHelloResponse composeGreeting(@Body SyncHelloRequest req) {
Assert.notNull(req, "req must not be null");
String greeting = "Hello " + req.getName();
SyncHelloResponse res = new SyncHelloResponse();
res.setGreeting(greeting);
return res;
}
} |
Unit test implementations
Code Block |
---|
@ActiveRoutes(classes = SyncHelloRoute.class)
public class SyncHelloRouteTest extends AbstractExampleModuleTest {
@Produce(uri = TestWsUriBuilder.URI_WS_IN + "syncHelloRequest")
private ProducerTemplate producer;
@EndpointInject(uri = "mock:test")
private MockEndpoint mock;
/**
* Checking successful calling.
*/
@Test
public void testSyncHelloRoute() throws Exception {
String xml = "<syncHelloRequest xmlns=\"http://openhubframework.org/ws/HelloService-v1\">"
+ " <name>Mr. Parker</name>"
+ "</syncHelloRequest>";
String output = producer.requestBody((Object)xml, String.class);
SyncHelloResponse res = Tools.unmarshalFromXml(output, SyncHelloResponse.class);
assertThat(res, notNullValue());
assertThat(res.getGreeting(), is("Hello Mr. Parker"));
}
} |