0

Hi I am trying to use Camel-SOAP component to unmarshal a soap message, sent using MQ. But I can't figure out how to use ServiceInterfaceStrategy required by and SoapJaxbDataFormat

I'm using maven-jaxb2-plugin to generated my JAXB beans, using the provieded wsdl, xsd's.

What class should I use ?
And how do I generate it with maven-jaxb2-plugin ?

SoapJaxbDataFormat soap = new 
SoapJaxbDataFormat("xx.xxx.service._201x._01._01.notification", new 
ServiceInterfaceStrategy(WHAT_CLASS_TO_USE.class, false));
Kasper Odgaard
  • 113
  • 2
  • 10

1 Answers1

2

And how do I generate it with maven-jaxb2-plugin ?

To generate your class files using the plugin, try the following configuration:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.13.1</version>
    <executions>
        <execution>
            <id>generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <schemaDirectory>src/test/resources/wsdl</schemaDirectory>
                <generatePackage>org.tempuri.calculator.jaxb2</generatePackage>
                <generateDirectory>src/test/java</generateDirectory>
                <clearOutputDir>false</clearOutputDir>
                <episode>false</episode>
                <strict>true</strict>
                <schemaIncludes>
                    <schemaInclude>*.wsdl</schemaInclude>
                    <schemaInclude>*.xsd</schemaInclude>
                </schemaIncludes>
            </configuration>
        </execution>
    </executions>
</plugin>

The maven command to generate the sources is: mvn generate-sources.

What class should I use ?

To use it in your routes, try the following:

protected SoapJaxbDataFormat createDataFormat() {
    String jaxbPackage = Add.class.getPackage().getName();
    ElementNameStrategy elStrat = new TypeNameStrategy();
    SoapJaxbDataFormat answer = new SoapJaxbDataFormat(jaxbPackage, elStrat);
    answer.setVersion("1.2");
    return answer;
}

@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            SoapJaxbDataFormat df = createDataFormat();
            from("direct:start") //
                .marshal(df) //
                .to("mock:result");
        }
    };
}

The message should be a XML like this:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope" xmlns:ns2="http://tempuri.org/">
    <Body>
        <ns2:Add>
            <ns2:intA>10</ns2:intA>
            <ns2:intB>20</ns2:intB>
        </ns2:Add>
    </Body>
</Envelope>

The POJO counterpart (generated by the jaxb2 plugin):

package org.tempuri.calculator.jaxb2;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "intA",
    "intB"
})
@XmlRootElement(name = "Add")
public class Add {

    protected int intA;
    protected int intB;

    public int getIntA() {
        return intA;
    }

    public void setIntA(int value) {
        this.intA = value;
    }

    public int getIntB() {
        return intB;
    }

    public void setIntB(int value) {
        this.intB = value;
    }

}

Don't forget to add the camel-soap dependency to your pom file:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-soap</artifactId>
</dependency>

The WSDL used by this example could be found here, based on this unit test.

Ricardo Zanini
  • 1,041
  • 7
  • 12