There may not be a simple way to do this in a pure Java way with CDI and
Camel Java DSL routes.  But I've been able to get my application running in
the karaf 4.0.6 with just CDI with one exception.

Thanks in advance for any comments, questions or criticisms.

Brad

Here's a very simple blueprint example:

<cxf:cxfEndpoint id="myEndpoint" address="/myendpointaddress/"
serviceClass="org.foo.ServiceAPI"
/>
<camelContext xmlns="http://camel.apache.org/schema/blueprint";>
<route id="cxf">
<!-- route starts from the cxf webservice in POJO mode -->
<from uri="cxf:bean:myEndpoint" />

<recipientList>
<simple>direct-vm:${header.operationName}</simple>
</recipientList>
</route>
</camelContext>


I'm going to lash up some tests for what I have below but the web services
tests take a bit of time and I thought I'd just run it by folks to see if
this looks at least plausible.

The first thing is an annotation for setting values on a CXFEndpoint. Then
the producer and finally the route builder.

@Retention(RUNTIME) @Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface CXFEndpointConfig {
Class serviceClazz();
String address();
}

Then a producer that gets such an injectionpoint and looks for that config.

@Singleton
public class EndpointFactory {

@Produce
public CxfEndpoint getCxfEndpoint(InjectionPoint injectEndpoint) {

CXFEndpointConfig endpointConfig =
injectEndpoint.getAnnotated().getAnnotation(CXFEndpointConfig.class);
CxfEndpoint endpoint = null;
if (endpointConfig != null) {
endpoint = new CxfEndpoint();
endpoint.setServiceClass(endpointConfig.serviceClazz());
endpoint.getInInterceptors().add(new LoggingInInterceptor());
endpoint.getOutInterceptors().add(new LoggingOutInterceptor());
endpoint.setAddress(endpointConfig.address());
}
return endpoint;

}
}

//I'm not explicitly setting the service name in the endpoint though I
could add another property on the annotation for that.  But the API service
class has a WebService with name of "whiteVaultService" and the variable in
the route builder also has that name.  I believe the latter is what the
cxf:bean:xxxx is looking for in any case.

As I said I'll set this up and run some SOAP UI tests against it soon but
wanted to make sure I wasn't being all wrong headed about this.

@Inject
@CXFEndpointConfig(address = "/whitevault/", serviceClazz =
org.enjekt.panda.commons.api.WhiteVaultAPI.class)
CxfEndpoint whiteVaultService;


@Override
    public void configure() {
        // you can configure the route rule with Java DSL here

        from("cxf:bean:whiteVaultService")
        .recipientList("direct-vm:${header.operationName}");



}

Reply via email to